我有兩個相同類的列表,並且希望生成出現在兩個列表中的對象的計數。比較兩個列表以獲取在兩個列表中出現的對象
Dim repeatingMentions As Integer
repeatingMentions =currentMentions.Where(Function(m) previousMentions.Contains(m)).Count
調試我可以看到兩個列表包含有完全相同的屬性值的對象,這是足以滿足包含因爲計數回來爲0
我有兩個相同類的列表,並且希望生成出現在兩個列表中的對象的計數。比較兩個列表以獲取在兩個列表中出現的對象
Dim repeatingMentions As Integer
repeatingMentions =currentMentions.Where(Function(m) previousMentions.Contains(m)).Count
調試我可以看到兩個列表包含有完全相同的屬性值的對象,這是足以滿足包含因爲計數回來爲0
您必須重寫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()
使用Intersect方法從LINQ到找到在兩個序列中相交,然後調用Count
方法來計算它。
repeatingMentions = currentMentions.Intersect(previousMentions).Count()
請注意,上述方法默認情況下通過引用比較實例。如果你想自定義實現,你需要使用this overload of Intersect,這需要IEqualityComparer
作爲參數。
作爲類似乎沒有不這樣可不行重寫'Equals' +'GetHashCode'(_「包含具有完全相同屬性值的對象,...計數返回爲0。」_) – 2014-10-07 11:11:50
@TimSchmelter我正在更新我的答案,補充說明一下。 – 2014-10-07 11:13:51
非常感謝,當然引用會有所不同,所以計數是正確的。我要添加我自己的比較器,看看如何運作 – DavidB 2014-10-07 11:18:37
讓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
您可以使用此相交擴展方法。(您可能必須通過引用命名空間System.Linq的引用它)
與字符串列表爲例。
List<string> a = new List<string>();
List<string> b = new List<string>();
var result = a.Intersect(b);
根據你的對象,你應該實現的IEqualityComparer並把它傳遞到相交的方法來正確地比較對象(實現平等相待,getHash)
謝謝,因爲這回答了原來的問題,並有其他解決方案。 – DavidB 2014-10-07 11:19:16