首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于另一个集合过滤集合

基于另一个集合过滤集合
EN

Stack Overflow用户
提问于 2012-08-07 02:23:28
回答 4查看 870关注 0票数 1

我有一个List<businessobject>对象集合和一个List<string>对象集合。我想过滤我的List<businessobject>,这样如果业务对象中的某个属性等于List<string>,它就会被过滤掉。我可以考虑这样写代码,但是有没有更快或者更好的方法呢?

代码语言:javascript
复制
List<businessobject> bo = loadBusinessObjectList();
List<string> stringList = loadStringList();
foreach(businessobject busobj in bo){
   if(stringList.contains(busobj.myProperty))
      bo.remove(busobj)
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-07 03:17:08

比到目前为止发布的其他代码简单得多。

代码语言:javascript
复制
bo.Where(o => !stringList.Contains(o.MyProperty));
票数 1
EN

Stack Overflow用户

发布于 2012-08-07 02:27:09

您的原始代码实际上将不起作用,因为您修改了您正在枚举的列表。

你可以这样做:

代码语言:javascript
复制
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);

如果您修改

代码语言:javascript
复制
List<string> stringList

成为

代码语言:javascript
复制
HashSet<string> stringList

性能将会提高,特别是如果字符串的数量很大,因为列表成员关系的测试是O(n),而哈希集成员关系的测试接近O(1)。

票数 5
EN

Stack Overflow用户

发布于 2012-08-07 02:26:41

Linq是你的朋友!

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11833774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档