簡體   English   中英

根據另一個集合過濾一個集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM