簡體   English   中英

元組上的C#containskey

[英]C# containskey on tuple

我有一個帶元組函數和int的字典

Dictionary<Tuple<string,string>, int> fullNames = new Dictionary<Tuple<string,string>, int>();

元組類定義為

public class Tuple<T, T2> 
{ 
    public Tuple(T first, T2 second) 
    { 
        First = first; 
        Second = second; 
    } 
    public T First { get; set; } 
    public T2 Second { get; set; } 

}

我想這樣使用Containskey函數

if (fullNames.ContainsKey(Tuple<"firstname","lastname">))

但是我遇到了過載錯誤。 有什么建議么?

您提供的代碼無效,因為您試圖在實際對象應該放置的地方提供類型定義(並且類型定義也無效,因為字符串實際上不是泛型的System.String類型。期望)。 如果元組是字典的鍵值,則可以執行以下操作:

if(fullNames.ContainsKey(new Tuple<string, string>("firstname", "lastname")))

但是,由於內存中創建的具有相同屬性的兩個元組不一定是同一對象,因此您可能會遇到引用相等問題。 這樣做會更好:

Tuple<string, string> testTuple = new Tuple<string, string>("firstname", "lastname");
if(fullNames.Keys.Any(x => x.First == testTuple.First && x.Second == testTuple.Second))

這將告訴您是否存在共享相同屬性數據的密鑰。 然后訪問該元素將變得同樣復雜。

編輯:長話短說,如果您打算對鍵使用引用類型,則需要確保您的對象以適當的方式實現EqualsGetHashCode ,以正確地識別內存實例中的兩個相同。

if (fullNames.ContainsKey(new Tuple<string, string> ("firstname", "lastname")))
{ /* do stuff */ }

為了將您的Tuple用作Dictionary <>中的鍵,您需要正確地實現GetHashCodeEquals方法:

public class Tuple<T, T2> 
{ 
    public Tuple(T first, T2 second) 
    { 
        First = first; 
        Second = second; 
    } 
    public T First { get; set; } 
    public T2 Second { get; set; }

    public override int GetHashCode()
    {
      return First.GetHashCode() ^ Second.GetHashCode();
    }

    public override Equals(object other)
    {
       Tuple<T, T2> t = other as Tuple<T, T2>;
       return t != null && t.First.Equals(First) && t.Second.Equals(Second);
    }

}

否則,將通過引用進行密鑰相等性檢查。 結果是new Tuple("A", "B") != new Tuple("A", "B")

有關哈希碼生成的更多信息: 重寫的System.Object.GetHashCode的最佳算法是什么?

.Net 4.0具有Tuple類型,該類型適用於您的情況,因為Equal方法已重載以使用您類型中的Equal

Dictionary<Tuple<string, string>, int> fullNames = 
    new Dictionary<Tuple<string, string>, int>();
fullNames.Add(new Tuple<string, string>("firstname", "lastname"), 1);
Console.WriteLine(fullNames.ContainsKey(
    new Tuple<string, string>("firstname","lastname"))); //True
Tuple<type,type> tuple = new Tuple("firsdtname", "lastname")

您已經編寫了代碼來創建未知類型的atuple的實例。

暫無
暫無

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

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