我有一个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 :(得分: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)。
答案 1 :(得分: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);
答案 2 :(得分:1)
比目前发布的其他代码简单得多......
bo.Where(o => !stringList.Contains(o.MyProperty));
答案 3 :(得分:0)
List<businessobject> bo = loadBusinessObjectList();
List<string> stringList = loadStringList();
List<businesssobject> bo2 = bo.FindAll(obj => !(stringList.contains(obj.myProperty)));
不确定这是否更快。不是删除对象,而是创建一个只包含匹配对象的新对象。