2012-08-06 122 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