LINQ - условная навигация в списке - PullRequest
1 голос
/ 25 апреля 2020

Допустим, у меня есть список объектов, которые наследуются от одного базового класса. Можно ли получить значение, указанное только в одном из подклассов, через LINQ? В моем примере я хочу найти экземпляр, который имеет специфицированный c объект, который имеет специфическое c свойство?

Я сделал этот пример в Linqpad:

void Main()
{
    var list = new List<A>
    {
        new B
        {
        MyProp = new D{ OtherProp = 1}
        },
        new C(),
        new B
        {
        MyProp = new D{ OtherProp = 30}
        },
    };

    list.Where(x => ....) // how to find the instance where OtherProp == 30 ?

}

public class A
{
    public int JustAprop { get; set; }

}

public class B : A
{
    public D MyProp { get; set; }
}

public class C : A
{

}

public class D
{
    public int OtherProp { get; set; }
}

1 Ответ

3 голосов
/ 25 апреля 2020

Вы можете использовать метод Where и попытаться привести каждый элемент к классу B, затем значение OtherProp внутри MyProp

var result = list.Where(l => (l as B)?.MyProp?.OtherProp == 30);

Это можно переписать немного используя сопоставление с шаблоном is оператор

var result = list.Where(l => l is B b && b.MyProp.OtherProp == 30);

Другой способ - использовать метод OfType<T>, чтобы получить список только B экземпляров, затем проверить OtherProp внутри MyProp

var result = list.OfType<B>().Where(b => b.MyProp.OtherProp == 30);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...