![](/img/trans.png)
[英]Questions about IEqualityComparer<T> / List<T>.Distinct()
[英]Distinct of List <T> not workiong
我有比較器班
public partial class CityCountryID :IEqualityComparer<CityCountryID>
{
public string City { get; set; }
public string CountryId { get; set; }
public bool Equals(CityCountryID left, CityCountryID right)
{
if ((object)left == null && (object)right == null)
{
return true;
}
if ((object)left == null || (object)right == null)
{
return false;
}
return left.City.Trim().TrimEnd('\r', '\n') == right.City.Trim().TrimEnd('\r', '\n')
&& left.CountryId == right.CountryId;
}
public int GetHashCode(CityCountryID obj)
{
return (obj.City + obj.CountryId).GetHashCode();
}
}
我嘗試使用Hashset和Distinct,但沒有一個起作用。 我不想在db中執行此操作,因為列表太大,對於everrrrrrrr也是如此。 為什么這在C#中不起作用? 我想獲得一個獨特的國家/地區城市列表。
List<CityCountryID> CityList = LoadData("GetCityList").ToList();
//var unique = new HashSet<CityCountryID>(CityList);
Console.WriteLine("Loading Completed/ Checking Duplicates");
List<CityCountryID> unique = CityList.Distinct().ToList();
您的Equals
和GetHashCode
方法不一致。 在Equals
,您正在修剪城市名稱-但是在GetHashCode
您不是。 這意味着兩個相等的值可以具有不同的哈希碼,這違反了常規合同。
那是要解決的第一件事。 我建議修剪數據庫本身中的城市名稱以保持理智,然后在“ Equality
檢查中刪除“ Trim
操作。 這會使事情變得簡單得多。
第二個是弄清楚為什么它在數據庫中要花很長時間的原因 :我強烈希望它在數據庫中的性能要好於本地,尤其是當您在兩個字段上都有索引時。
下一步是考慮使類型盡可能不變。 允許對象的可變屬性影響相等性通常是一個壞主意。 如果在將對象用作字典中的鍵之后(或將其添加到HashSet
)更改對象的相等性敏感屬性,則可能會發現您無法再次檢索它,即使使用完全相同的引用也是如此。
編輯:另外,正如Scott指出的那樣,您要么需要傳遞IEqualityComparer
來執行相等比較, 要么使您的類型重寫常規的Equals
和GetHashCode
方法。 目前,您處於兩者之間的一半(實現IEqualityComparer<T>
,但實際上沒有提供比較器作為Distinct
或HashSet
構造函數的參數)。 通常,對於類型自己實現IEqualityComparer
的類型是很不常見的。 基本上,您可以在類型中實現“自然”相等性檢查, 或者在實現IEqualityComparer<T>
的類型中實現獨立的相等性檢查。 您沒有實現IEquatable<T>
-只是壓倒一切正常Equals(object)
方法將工作-但它通常是實現一個不錯的主意IEquatable<T>
在同一時間。
順便說一句,我也建議不使用字符串連接來計算哈希碼。 例如:
public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + CountryId.GetHashCode();
hash = hash * 31 + City.GetHashCode();
return hash;
}
您需要實現IEquatable<T>
接口IEquatable<T>
不是IEqualityComparer<T>
(請務必閱讀文檔,尤其是“ 對實現者的注意事項 ”部分!)。 IEqualityComparer是您要使用自定義比較器而不是內置於該類的默認比較器時。
你也需要做出改變喬恩提及有關GetHashCode
不匹配Equals
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.