2

私は複数のリソースを精査してきましたが、これを理解することはできません。数レベルの深さでネストされたプロパティに基づいてオブジェクトの配列をフィルタリングしようとしています。物事を単純化したので、次のクラスがあるとしましょう。

class A {
  B[] bb;
}

class B 
  C[] cc;
}

class C {
  string value;
}

そして今、コード:

A[] aa = ...;
A[] filteredAa = aa.Where(... //NEED HELP HERE

私がやりたいのは、aa配列をフィルタリングして、少なくとも1つのC要素を持つ少なくとも1つのB要素を持つA要素だけが「hello」の値を持つようにすることです(たとえば、aa[0]はに含まれますaa [0] .bb [3] .cc [2] .value = "hello"の場合、filteredAa配列。

このタイプのフィルタリングも実行できますか?これが理にかなっていると思いますが、さらに明確にできるかどうか教えてください。

4

4 に答える 4

4

使用する必要がありますAny-そして、2回使用する必要があるようです:

var query = aa.Where(a => a.bb.Any(b => b.cc.Any(c => c.value == "hello")));

内部からの作業:

  • C値が「hello」のオブジェクトは便利です
  • その値のいずれかB有用である場合、オブジェクトは有用ですC
  • その値のいずれかAが有用である場合、オブジェクトは有用ですB
  • WhereオブジェクトのシーケンスをフィルタリングしA、有用なものだけを残します

本当にToArray()配列が必要な場合は最後に使用できますが、私は通常、.ToListIEnumerable<A>

于 2013-01-21T16:30:30.767 に答える
1

これを試して:

A[] filteredAa = aa.Where(a => a.bb.Any(b => b.cc.Any(c => c.value == "hello"))).ToArray();
于 2013-01-21T16:29:40.830 に答える
0
filteredAa = aa.Where(x => x.bb.Any(y => y.cc.Any(z => z.value == "hello")))
于 2013-01-21T16:39:46.050 に答える
0

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)));
于 2013-01-21T16:30:30.640 に答える