簡體   English   中英

GroupBy 和 IEqualityComparer<TKey> 比較器

[英]GroupBy and IEqualityComparer<TKey> comparer

我正在 LINQ 中通過 GroupBy 方法:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IEqualityComparer<TKey> comparer
)

我了解如何使用 GroupBy 及其返回的內容。 我想了解IEqualityComparer<TKey> comparer的重要性以及它在 GroupBy 中的實際用途。

IEqualityComparer<TKey>對象將用於執行兩步檢查,以查看TKey實例是否與現有組的鍵“相等”,因此應該在該組中:

  1. 它根據現有鍵的哈希碼檢查項目的哈希碼(使用GetHashCode )。 如果它不等於任何這些值,則將其添加到新組中
  2. 如果找到匹配的哈希碼,則它檢查相等性(使用Equals )。 如果項目“等於”組鍵,則將項目添加到該組。

如果您提供比較器(通過傳遞null或使用沒有該參數的重載之一),則使用“默認”比較器,如果它實現了IEquatable或任何適用的Equals覆蓋,則使用TKey類本身和GetHashCode

所以這意味着EqualsGetHashCode之間的一些關鍵關系:

  • 如果兩個項目相等,則它們必須具有相同的哈希碼。
  • 相反的是不正確的-具有相同的散列碼不必等於兩個項目。

您提供了一個無意義的平等比較器,因此您的結果將是無意義的。 您的哈希碼基於對比較器本身的引用,這與您的Equals方法中的任何內容無關,並且在您的Equals方法中,如果第一個對象與第二個字符串。 這毫無意義,它甚至違反了等式的基本屬性,因為參數的順序應該無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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