2014-10-07 94 views
1

我有兩個相同類的列表,並且希望生成出現在兩個列表中的對象的計數。比較兩個列表以獲取在兩個列表中出現的對象

Dim repeatingMentions As Integer 
repeatingMentions =currentMentions.Where(Function(m) previousMentions.Contains(m)).Count 

調試我可以看到兩個列表包含有完全相同的屬性值的對象,這是足以滿足包含因爲計數回來爲0

回答

2

您必須重寫Equals + GetHashCode或提供自定義IEqualityComparer(Of YourClassName)以使其與Contains一起使用。或者你必須使用Any

repeatingMentions = currentMentions. 
    Count(Function(m) previousMentions. 
     Any(Function(p) m.PropertyName = p.PropertyName)) 

,或者你可以通過Enumerable.Join加入兩份名單:

Dim inBoth = From currMent In currentMentions 
      Join prevMent In previousMentions 
      On currMent.PropertyName Equals prevMent.PropertyName 
repeatingMentions = inBoth.Count() 
+0

謝謝,因爲這回答了原來的問題,並有其他解決方案。 – DavidB 2014-10-07 11:19:16

1

使用Intersect方法從LINQ到找到在兩個序列中相交,然後調用Count方法來計算它。

repeatingMentions = currentMentions.Intersect(previousMentions).Count() 

請注意,上述方法默認情況下通過引用比較實例。如果你想自定義實現,你需要使用this overload of Intersect,這需要IEqualityComparer作爲參數。

+0

作爲類似乎沒有不這樣可不行重寫'Equals' +'GetHashCode'(_「包含具有完全相同屬性值的對象,...計數返回爲0。」_) – 2014-10-07 11:11:50

+0

@TimSchmelter我正在更新我的答案,補充說明一下。 – 2014-10-07 11:13:51

+0

非常感謝,當然引用會有所不同,所以計數是正確的。我要添加我自己的比較器,看看如何運作 – DavidB 2014-10-07 11:18:37

0

a()b()是兩個整型數組,你可以選擇兩種常見元素的個數使用下面的代碼的數組。與字符串數組的情況一樣。

Dim a As Integer() = {1, 5, 2, 3, 6, 4, 7, 89, 5, 8} 
    Dim b As Integer() = {4, 78, 85, 2, 2, 3, 1, 4, 8} 
    Dim count As Integer = a.Intersect(b).Count 
0

您可以使用此相交擴展方法。(您可能必須通過引用命名空間System.Linq的引用它)

與字符串列表爲例。

List<string> a = new List<string>(); 
List<string> b = new List<string>(); 

var result = a.Intersect(b); 

根據你的對象,你應該實現的IEqualityComparer並把它傳遞到相交的方法來正確地比較對象(實現平等相待,getHash)