簡體   English   中英

C#覆蓋字典ContainsKey

[英]C# override Dictionary ContainsKey

我只是找不到任何合適的代碼來滿足我的需要。

我正在使用Dict.ContainsKey但由於我總是創建我需要尋找的密鑰的事實,因此對於ContainsKey我總是會得到false(因為hashKey是不同的並且我正在創建所有我想檢查的密鑰)。

有人可以建議在這種情況下如何重寫包含密鑰或如何處理密鑰嗎? 我的字典看起來像Dictionary<someObj, int>

public class someObj
{
    public int someobjParam {get;set;}
    public int someobjParamTwo {get;set;}
}

你並不需要覆蓋ContainsKey -你需要或者重載EqualsGetHashCodesomeObj (應改名以符合.NET命名約定,順便說一句), 或者你需要傳遞一個IEqualityComparer<someObj>Dictionary<,>構造函數 無論哪種方式,該代碼都用於比較鍵(並從中獲取哈希碼)。

基本上,您需要讓Equals確定相等性,並使GetHashCode返回相同對象的相同代碼,理想情況下返回不同對象的不同代碼-有關更多詳細信息,請參閱Eric Lippert在GetHashCode上的文章

另外,您應該考慮使someObj不可變:可變的字典鍵通常是一個壞主意,就像您在將其用作字典中的鍵之后以對哈希碼敏感的方式修改鍵一樣,您將無法再次找到它。 如果您的自定義類型的要點確實是關鍵,那么只需使其不可變即可。

為簡單起見,您還應該考慮使someObj實現IEquatable<someObj> ,並考慮將結構代替類是否合適。 如果要實現IEquatable<someObj>應該覆蓋object.Equals以一致的方式。 通常, object.Equals實現將只調用最強類型的IEquatable<T>.Equals實現。

您不需要重寫ContainsKey ,而是在字典應認為兩個鍵相等時指示字典。

一種方法是在您的鍵類中實現IEquatable<someObj> 如果平等的概念在您的應用程序中是全球性的,請執行以下操作:

public class someObj : IEquatable<someObj>
{
    public int someobjParam {get;set;}
    public int someobjParamTwo {get;set;}

    // override GetHashCode() and Equals(); for an example
    // see http://msdn.microsoft.com/en-us/library/ms131190%28v=vs.110%29.aspx
}

另一個是通過實現IEqualityComparer<someObj>並將其傳遞給字典的構造函數。

暫無
暫無

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

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