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。

您可以执行以下操作:

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

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); 
于 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 回答