1

List<businessobject>オブジェクト コレクションとオブジェクト コレクションがありList<string>ます。List<businessobject>ビジネスオブジェクトの特定のプロパティが何かに等しい場合、それが除外されるようにフィルターをかけたいと思いますList<string>。このようにコードを書くことも考えられますが、より速い方法やより良い方法はありますか?

List<businessobject> bo = loadBusinessObjectList();
List<string> stringList = loadStringList();
foreach(businessobject busobj in bo){
   if(stringList.contains(busobj.myProperty))
      bo.remove(busobj)
}
4

4 に答える 4

5

列挙しているリストを変更するため、元のコードは実際には機能しません。

次のようなことができます:

List<businessobject> bo = loadBusinessObjectList();
List<string> stringList = loadStringList();

var matches = (from b in bo where stringList.Contains(b.SomeProperty) select b);
var bo = bo.Intersect(matches);

変更する場合

List<string> stringList

することが

HashSet<string> stringList

特に文字列の数が多い場合、リスト メンバーシップのテストは O(n) であるのに対し、ハッシュセット メンバーシップのテストは O(1) に近づくため、パフォーマンスが向上します。

于 2012-08-06T18:27:09.133 に答える
2

リンクはあなたの友達です!

List<businessobject> boList = loadBusinessObjectList();
List<string> stringList = loadStringList();

var badObjects = from bo in boList
             where stringList.Contains(bo.myProperty)
             select bo;

boList.RemoveRange(badObjects); 
于 2012-08-06T18:26:41.213 に答える
1

これまでに投稿された残りのコードよりもはるかに単純です...

bo.Where(o => !stringList.Contains(o.MyProperty));
于 2012-08-06T19:17:07.793 に答える
0
List<businessobject> bo = loadBusinessObjectList();
List<string> stringList = loadStringList();
List<businesssobject> bo2 = bo.FindAll(obj => !(stringList.contains(obj.myProperty)));

これが速いかどうかはわかりません。オブジェクトを削除する代わりに、これは一致するものだけで新しいオブジェクトを作成します。

于 2012-08-06T18:34:19.553 に答える