Необходимо фильтровать данные на основе данных нескольких классов - PullRequest
1 голос
/ 12 апреля 2020

У меня есть 3 класса, как показано ниже,

public class Main
{
    public string MainName { get; set; }
    public List<SubClass1> SubClass1S { get; set; }

    public List<SubClass2> SubClass2S { get; set; }
}

public class SubClass1
{
    public string SubClass1Name { get; set; }
}

public class SubClass2
{
    public string Name { get; set; }
    public string Config { get; set; }
}

и ниже приведены мои образцы данных,

var lsMains = new List<Main>();

        var main1 = new Main
        {
            MainName = "main1",
            SubClass1S = new List<SubClass1> { new SubClass1 { SubClass1Name = "sub1" }, new SubClass1 { SubClass1Name = "sub2" } },
            SubClass2S = new List<SubClass2> { new SubClass2 { Name = "N1", Config = "C1" } }
        };

        lsMains.Add(main1);

        var main2 = new Main
        {
            MainName = "main2",
            SubClass1S = new List<SubClass1> { new SubClass1 { SubClass1Name = "sub1" } },
            SubClass2S = new List<SubClass2> { new SubClass2 { Name = "N1", Config = "C1" }, new SubClass2 { Name = "N2", Config = "C2" } }
        };

        lsMains.Add(main2);

        var main3 = new Main
        {
            MainName = "main3",
            SubClass1S = new List<SubClass1> { new SubClass1 { SubClass1Name = "sub3" } },
            SubClass2S = new List<SubClass2> { new SubClass2 { Name = "N1", Config = "C1" }, new SubClass2 { Name = "N2", Config = "C2" } }
        };

        lsMains.Add(main2);

Теперь мне нужно отфильтровать данные,

  1. , где SubClass1Name = "sub1" и число в списке SubClass1 = 1
  2. , где SubClass2 config равно "C1", Config = "C1"

Класс результата должен иметь вид это,

var result = new Result
        {
            MainName = "main2",
            SubClass2Config = "C1",
            SubClass2Name = "N1"
        };

Я пробовал это, как фильтровать на 2-й класс SubClass2? Спасибо!

var X1 = lsMains.Where(x => x.SubClass1S.Count == 1).ToList();
        foreach (var x in X1)
        {
            if (x.SubClass1S.Where(y => y.SubClass1Name == "sub1"))
            {

            }
        }

1 Ответ

2 голосов
/ 12 апреля 2020

Вы можете сделать это:

var parentFilteredList = lsMains
            .Where(c => c.SubClass1S.Any(d => d.SubClass1Name == "sub1") 
                        &&  c.SubClass2S.Any(d => d.Config == "C1") 
                        &&  c.SubClass1S.Count == 1)
            .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...