簡體   English   中英

名單不同 <T> 不努力

[英]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();

您的EqualsGetHashCode方法不一致。 Equals ,您正在修剪城市名稱-但是在GetHashCode您不是。 這意味着兩個相等的值可以具有不同的哈希碼,這違反了常規合同。

那是要解決的第一件事。 我建議修剪數據庫本身中的城市名稱以保持理智,然后在“ Equality檢查中刪除“ Trim操作。 這會使事情變得簡單得多。

第二個是弄清楚為什么它在數據庫中要花很長時間的原因 :我強烈希望它在數據庫中的性能要好於本地,尤其是當您在兩個字段上都有索引時。

下一步是考慮使類型盡可能不變。 允許對象的可變屬性影響相等性通常是一個壞主意。 如果在將對象用作字典中的鍵之后(或將其添加到HashSet )更改對象的相等性敏感屬性,則可能會發現您無法再次檢索它,即使使用完全相同的引用也是如此。

編輯:另外,正如Scott指出的那樣,您要么需要傳遞IEqualityComparer來執行相等比較, 要么使您的類型重寫常規的EqualsGetHashCode方法。 目前,您處於兩者之間的一半(實現IEqualityComparer<T> ,但實際上沒有提供比較器作為DistinctHashSet構造函數的參數)。 通常,對於類型自己實現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.

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