[英]Filtering a collection based on another collection
我有一個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)
}
您的原始代碼實際上將不起作用,因為您修改了要枚舉的列表。
您可以執行以下操作:
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)。
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);
比到目前為止發布的其余代碼簡單得多...
bo.Where(o => !stringList.Contains(o.MyProperty));
List<businessobject> bo = loadBusinessObjectList();
List<string> stringList = loadStringList();
List<businesssobject> bo2 = bo.FindAll(obj => !(stringList.contains(obj.myProperty)));
不知道這是否更快。 它不會刪除對象,而是創建一個僅包含匹配對象的新對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.