Linq фильтрует дочерний класс и возвращает родительский класс? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь отфильтровать список классов внутри родительского класса, но мне нужно вернуть родительский класс.

C# Код:

        // Must return `Parents` class
        public Parents FilterByAge()
        {
            Parents Family = new Parents() { FatherName = "John", MotherName = "Mary" };
            Family.Children = new List<Children>(){
                new Children{ Name = "Peter",Age=20},
                new Children{ Name = "Alber",Age=15},
                new Children{ Name = "Alex",Age=10},
                new Children{ Name = "Ched",Age=5},
            };
            // Fail here, It will return `Children` class instead of `Parents` class.
            return Family.Children.Where(o => o.Name == "Peter");

            // Fail too, will show 'Family does not contain a definition for Where'
            //return Family.Where(f => f.Children.Any(c => c.Name == "Peter"));

        }
        class Parents
        {
            public string FatherName { get; set; }
            public string MotherName { get; set; }
            public List<Children> Children { get; set; }
        }
        class Children
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }

Как вернуть родительский класс после того, как Linq отфильтрует дочерний класс ? (Просто используйте Linq и вернитесь в одну строку, не изменяя данные и не создавая новый класс)

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

As List<T> имеет метод RemoveAll, который изменяет список на месте:

public Parents FilterByAge()
{
    Parents family = new Parents() { FatherName = "John", MotherName = "Mary" };
    family.Children = new List<Children>()
    {
        new Children{ Name = "Peter", Age = 20 },
        new Children{ Name = "Alber", Age = 15 },
        new Children{ Name = "Alex", Age = 10 },
        new Children{ Name = "Ched", Age =5 }
    };

    family.Children.RemoveAll(child => child.Name != "Peter");

    return family;
}
0 голосов
/ 28 мая 2020

Just use Linq and return in one line.: Создать новый объект и назначить родительские свойства. И назначьте отфильтрованный список для Children.

return new Parents() 
{ 
    FatherName = Family.FatherName, 
    MotherName = Family.MotherName,
    Children = Family.Children.Where(o => o.Name == "Peter")
};
0 голосов
/ 28 мая 2020

У вас должна быть возможность использовать return Family.Where(f => f.Children.Any(c => c.Name == "Peter"));

Могут быть более эффективные решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...