2012-03-05 7 views
15

可能な重複辞書スタイルのコレクション初期化子を作成します。私はシンプルペアクラス持っ
Custom Collection Initializersカスタムクラスに

を:

public class Pair<T1, T2> 
    { 
     public Pair(T1 value1, T2 value2) 
     { 
      Value1 = value1; 
      Value2 = value2; 
     } 

     public T1 Value1 { get; set; } 
     public T2 Value2 { get; set; } 
    } 

をそしてできるようにしたいと思いますディクショナリオブジェクトのようにそれをすべてのインラインで定義するには:

var temp = new Pair<int, string>[] 
     { 
      {0, "bob"}, 
      {1, "phil"}, 
      {0, "nick"} 
     }; 

しかし、完全に新しいペア(0、 "ボブ")などを定義するように頼んでいますが、これをどのように実装するのですか?

いつものように、ありがとうございました!

+0

良い質問!あなたの答えを編集して、正しい用語(コレクション初期化子)を使用しました。これは通常、物事のコレクション側で行われます(Add()メソッドが必要です)。この場合、配列を使用しているので、同じようには動作しません。しかし、それを動作させる方法があるかどうかを見ることに非常に興味があります! – MattDavey

+0

'KeyValuePair 'のファンはいませんか?または適用された知識のために行く? –

答えて

17

を参照してください。あなたのタイプはIEnumerableを実装し、適切なAddメソッドを持っている必要があります。 Arrayを初期化していますが、Addメソッドはありません。例

class PairList<T1, T2> : IEnumerable 
{ 
    private List<Pair<T1, T2>> _list = new List<Pair<T1, T2>>(); 

    public void Add(T1 arg1, T2 arg2) 
    { 
     _list.Add(new Pair<T1, T2>(arg1, arg2)); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 
} 

のために、次にあなたが

var temp = new PairList<int, string> 
{ 
    {0, "bob"}, 
    {1, "phil"}, 
    {0, "nick"} 
}; 
+0

あなたは 'int [] nums = {1,2,3};'が有効ではないことを示唆していますか?なぜなら、問題は、PairにAddメソッドがないことです。 – Chris

+0

@Chrisそれは辞書のようではありません。 –

+0

ええ、もっと見ると、どこに問題があるかがわかります。私は構文が私のコメントのようにPairオブジェクトの生成に問題があったと考えていました。より多くの事を見て(そしてこれを行うための有効なコードを書こうとすると)、元の投稿で使用されている構文が、あなたが言っていた配列のAdd(1、 "bob"存在しない。申し訳ありませんが、私は次の貧しい愚か者が私のように考えるようにコメントを残します。 :) – Chris

6

Dictionaryから継承するクラスを使用しないのはなぜですか?

public class PairDictionary : Dictionary<int, string> 
{ 
} 

private static void Main(string[] args) 
{ 
    var temp = new PairDictionary 
    { 
     {0, "bob"}, 
     {1, "phil"}, 
     {2, "nick"} 
    }; 

    Console.ReadKey(); 
} 
あなたはまた、 Dictionaryから継承しない独自のコレクションを(私はそう T1はあなたの例では、キーとして機能していない、あなたは二つの項目に同じ Value1を持っているので、それはケースである疑いがある)を作成することができ

あなたがコレクション初期化子の糖衣構文を使用する場合は、2つの引数(T1とあなたのケースでintstringあるT2を)かかりAdd方法を提供しなければなりません。

public void Add(int value1, string value2) 
{ 
} 

あなたは二つのことをサポートする必要が辞書のように動作するようにカスタム初期化を取得するにはCustom Collection Initializers

0

あなたが辞書で使用されているオブジェクトによって提供されていません探している構文を行うことができ、それは辞書コレクション自体です。 コレクションの初期化子を使用する必要がある場合は、既存のコレクション(辞書など)を使用するか、コレクションを格納するカスタムコレクションを実装する必要があります。

そうしないとは、基本的に制限されている:

var temp = new Pair<int, string>[] 
    { 
     new Pair(0, "bob"), 
     new Pair(1, "phil"), 
     new Pair(0, "nick") 
    }; 
2
public class Paircollection<T1, T2> : List<Pair<T1, T2>> 
{ 
    public void Add(T1 value1, T2 value2) 
    { 
     Add(new Pair<T1, T2>(value1, value2)); 
    } 
} 

、その後

var temp = new Paircollection<int, string> 
{ 
    {0, "bob"}, 
    {1, "phil"}, 
    {0, "nick"} 
}; 

動作します。基本的には、ちょうど良いものを追加する方法を知っているList<Pair<T1,T2>>のバージョンを作成しています。

これは、明らかに、Pair以外のどのクラスにも拡張可能です(辞書の解法とは異なります)。

私の最初の理解を助けてくださったYuriy Faktorovichと、私を正しい方向に向けるためのリンクされた質問に感謝します。

+1

おとぎ話になりませんが、 'foo'は必要ありません。あなたは決してそれを使用しません。 –

+0

大括弧は承認され、修正されました。これは、私がListを継承するのではなくメンバーとして使用していたときの二日酔いでした。 :) – Chris

関連する問題