1

タプル関数と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">))

しかし、過負荷エラーが発生しています。助言がありますか?

4

5 に答える 5

6

実際のオブジェクトがあるべき場所に型定義を提供しようとしているため、指定したコードは無効です(文字列は実際にはSystem.Stringジェネリックが期待する型ではないため、型定義も無効です)。タプルがディクショナリのキー値である場合は、次のように実行できます。

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

ただし、同じプロパティでメモリ内に作成された2つのタプルは必ずしも同じオブジェクトではないため、参照の同等性の問題に反する可能性があります。これを行う方が良いでしょう:

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

これにより、同じプロパティデータを共有するキーが存在するかどうかがわかります。その場合、その要素へのアクセスも同様に複雑になります。

編集:簡単に言えば、キーに参照型を使用することを計画している場合は、オブジェクトが実装されていることを確認しEqualsGetHashCodeメモリ内の2つの別々のインスタンスを適切に識別する方法が同じであることを確認する必要があります。

于 2012-04-25T17:08:35.547 に答える
4
if (fullNames.ContainsKey(new Tuple<string, string> ("firstname", "lastname")))
{ /* do stuff */ }
于 2012-04-25T17:08:47.687 に答える
4

辞書<>でキーとしてを使用するには、メソッドと:Tupleを正しく実装する必要があります。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に最適なアルゴリズムは何ですか?

于 2012-04-25T17:09:47.497 に答える
1

.Net 4.0にはタイプがあります。これは、メソッドがオーバーロードされてfromを使用するTupleため、ケースで機能します。EqualEqual

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
于 2012-04-25T17:09:08.780 に答える
0
Tuple<type,type> tuple = new Tuple("firsdtname", "lastname")

未知のタイプのatupleのインスタンスを作成するコードを記述しました。

于 2012-04-25T17:08:47.060 に答える