C# 基于另一个集合筛选集合

C# 基于另一个集合筛选集合,c#,asp.net,algorithm,C#,Asp.net,Algorithm,我有一个列表对象集合和一个列表对象集合。我想过滤我的列表,这样,如果业务对象中的某个属性等于任何值,那么列表将被过滤掉。我可以这样写代码,但是有没有更快更好的方法 List<businessobject> bo = loadBusinessObjectList(); List<string> stringList = loadStringList(); foreach(businessobject busobj in bo){ if(stringList.conta

我有一个
列表
对象集合和一个
列表
对象集合。我想过滤我的
列表
,这样,如果业务对象中的某个属性等于任何值,那么
列表
将被过滤掉。我可以这样写代码,但是有没有更快更好的方法

List<businessobject> bo = loadBusinessObjectList();
List<string> stringList = loadStringList();
foreach(businessobject busobj in bo){
   if(stringList.contains(busobj.myProperty))
      bo.remove(busobj)
}
List bo=loadBusinessObjectList();
List stringList=loadStringList();
foreach(bo中的businessobject busobj){
if(stringList.contains(busobj.myProperty))
bo.拆除(busobj)
}

林克是你的朋友

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

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

boList.RemoveRange(badObjects); 
List boList=loadBusinessObjectList();
List stringList=loadStringList();
var BADBOBJECTS=来自bo中的bo
其中stringList.Contains(bo.myProperty)
选择bo;
boList.Removate(坏物体);

林克是你的朋友

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

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

boList.RemoveRange(badObjects); 
List boList=loadBusinessObjectList();
List stringList=loadStringList();
var BADBOBJECTS=来自bo中的bo
其中stringList.Contains(bo.myProperty)
选择bo;
boList.Removate(坏物体);

您的原始代码实际上无法工作,因为您修改了正在枚举的列表

您可以执行以下操作:

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 bo=loadBusinessObjectList();
List stringList=loadStringList();
var matches=(从bo中的b开始,其中stringList.Contains(b.SomeProperty)选择b);
var bo=bo.Intersect(匹配);
如果您修改

List<string> stringList
List字符串列表
将来

HashSet字符串列表

性能将得到提高,特别是当字符串数量较大时,因为列表成员资格测试为O(n),而哈希集成员资格测试接近O(1)。

由于修改了正在枚举的列表,因此原始代码实际上无法工作

您可以执行以下操作:

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 bo=loadBusinessObjectList();
List stringList=loadStringList();
var matches=(从bo中的b开始,其中stringList.Contains(b.SomeProperty)选择b);
var bo=bo.Intersect(匹配);
如果您修改

List<string> stringList
List字符串列表
将来

HashSet字符串列表
性能将得到提高,特别是当字符串数量较大时,因为列表成员资格测试为O(n),而哈希集成员资格测试接近O(1)。

list bo=loadBusinessObjectList();
List stringList=loadStringList();
List bo2=bo.FindAll(obj=>!(stringList.contains(obj.myProperty));
不确定这是否更快。该对象不删除对象,而是创建一个仅包含匹配对象的新对象

List bo=loadBusinessObjectList();
List stringList=loadStringList();
List bo2=bo.FindAll(obj=>!(stringList.contains(obj.myProperty));

不确定这是否更快。该对象不删除对象,而是创建一个仅包含匹配对象的新对象

比目前发布的其他代码简单得多

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

比目前发布的其他代码简单得多

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

我不这样认为,除非你有心情做一些图形算法。我不这样认为,除非你有心情做一些图形算法。除了返回一个匹配的
IEnumerable
。它不过滤OP代码中显示的原始列表。此外,它还返回不匹配的IEnumerable,而不是已匹配的IEnumerable。除了返回匹配的IEnumerable之外。它不会过滤OP代码中显示的原始列表。此外,它会返回不匹配的IEnumerable,而不是已匹配的IEnumerable。此代码不会根据OP的请求修改原始列表。此代码不会根据OP的请求修改原始列表。