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的请求修改原始列表。