2012-08-06 119 views
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) 
} 
+0

我不這麼認爲,直到你在做一些圖形算法的心情。 – perilbrain 2012-08-06 18:26:42

回答

1

比迄今發佈的代碼的其餘部分簡單多了......

bo.Where(o => !stringList.Contains(o.MyProperty)); 
2

Linq是你的朋友!

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

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

boList.RemoveRange(badObjects); 
+0

除了返回匹配項的'IEnumerable '。它不按OP代碼中所示過濾原始列表。 – 2012-08-06 18:28:15

+0

另外,它返回一個IEnumerable的*不匹配*的東西,而不是事物。 – 2012-08-06 18:29:27

+0

@EricJ。你當然是對的。更正了代碼。 – Vitaliy 2012-08-06 18:32:13

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)。

0
List<businessobject> bo = loadBusinessObjectList(); 
List<string> stringList = loadStringList(); 
List<businesssobject> bo2 = bo.FindAll(obj => !(stringList.contains(obj.myProperty))); 

不知道這是否更快。不是刪除對象,而是創建一個只包含匹配對象的新對象。

+0

此代碼不會根據OP的要求修改原始列表。 – 2012-08-06 18:36:58