我一直在搜索多个资源,但找不出这一个;我正在尝试基于嵌套了几个级别深的Property来筛选对象数组。我已经简化了一些东西,所以假设我有以下类:
class A {
B[] bb;
}
class B
C[] cc;
}
class C {
string value;
}
现在的代码是:
A[] aa = ...;
A[] filteredAa = aa.Where(... //NEED HELP HERE
我想做的是过滤aa数组,这样它只给我那些至少有一个B元素的A元素,至少有一个子C元素的值为"hello"(例如,如果aa[0].bb[3].cc[2].value="hello",那么aa[0]将被包括在filteredAa数组中(。
这种类型的过滤甚至可以完成吗?我认为并希望这是有道理的,但如果我能进一步澄清,请告诉我。
你需要使用Any
-听起来你需要使用两次:
var query = aa.Where(a => a.bb.Any(b => b.cc.Any(c => c.value == "hello")));
所以从内部着手:
- 如果
C
对象的值为"hello",则该对象非常有用 - 如果
C
的任何值都有用,则B
对象是有用的 - 如果
B
的任何值都有用,则A
对象是有用的 Where
过滤一系列A
对象,只留下有用的对象
如果真的想要一个数组,那么可以在末尾使用ToArray()
,但我通常会使用ToList
或将其保留为IEnumerable<A>
。
试试这个:
A[] filteredAa = aa.Where(a => a.bb.Any(b => b.cc.Any(c => c.value == "hello"))).ToArray();
如果您正在查找Value
是特定值的位置:
var result = aa.Where(a=>a.bb.Any(b => b.cc.Any(c => c.Value == "hello"));
如果你只想得到所有有价值的东西:
var result = aa.Where(a=>a.bb.Any(b => b.cc.Any(c => !string.IsNullOrEmpty(c.Value)));
filteredAa = aa.Where(x => x.bb.Any(y => y.cc.Any(z => z.value == "hello")))