2012-04-25 16 views
1

私のようなのcontainsKey機能を使用したい のC#のcontainsKey

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; } 

} 

ように私はタプル機能を取り込み辞書やタプルクラスが定義されているint型

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

を持っています

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

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

+1

あなたは私たちに、エラーのテキストを与えることができますか? –

+0

メソッド 'ContainsKey'のオーバーロードに '2'がかかります – Badmiral

+0

'Tuple <" firstname "、" lastname ">'とは何ですか?あなたは '新しいタプル(" firstname "、" lastname ")'を意味しますか? –

答えて

5

文字列が実際にはタイプSystem.Stringではないため、実際のオブジェクトを配置する場所にタイプ定義を指定しようとしているため、入力したコードは無効です(タイプ定義も無効です)。ジェネリックは期待している)。

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

をしかし、同じプロパティを持つメモリ内に作成された2つのタプルがnecesarily同じではないので、あなたは抵触参照平等の問題の実行することができます:タプルは辞書のキー値がある場合は、これを行うことができますオブジェクト。

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

これは、同じプロパティデータを共有するキーが存在するかどうかを示します。その要素にアクセスすることは、それほど複雑になるでしょう。

EDIT:キーの参照型を使用する予定がある場合、オブジェクトがEqualsGetHashCodeを実装していることを確認する必要があります。

+0

+1少し速く、より多くの情報;) – Sascha

+0

コンストラクタ呼び出しの ''は、コンストラクタargsの型から推論することができるため、冗長です。 –

+2

また、.NET 4に含まれるTuple型を使用する場合、「Equals」と「GetHashCode」が期待どおりに実装されることにも言及する価値があります。 –

0
Tuple<type,type> tuple = new Tuple("firsdtname", "lastname") 

未知の種類のタプルのインスタンスを作成するコードを作成しました。

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

これは正しいものです – MilkyWayJoe

1

.NET 4.0はEqual方法があなたのタイプからEqualを使用するためにオーバーロードされているので、あなたのケースのために働くだろうTupleタイプを持っています。

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 
3

辞書<にキーとしてあなた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")。ハッシュコード生成の詳細については

What is the best algorithm for an overridden System.Object.GetHashCode?

+0

これは最も簡単な解決方法です。 –

+1

+1、 'Equals()'メソッドには戻り値の型が必要です。 – SidAhmed

関連する問題