2011-09-12 10 views
6

実際にはList<KeyValuePair<T, U>>のようなものが必要ですが、辞書のように初期化することができます(毎回new KeyValuePairを書き込まずに)。このように:List <KeyValuePair <T, U>>(Dictionary <T, U>のように)を簡単に初期化する方法はありますか?

Dictionary<string, string> dic = new Dictionary<string, string> 
{ 
    { "key1", "value1"}, 
    { "key2", "value2"} 
}; 
+0

実際には、あなたの目標はリストではなく辞書であるように見えます。これは挿入オーダーを維持します。つまり、その要素が自然順序ではなく、挿入順にソートされた の辞書です。これは正しいです? –

+0

いいえ、私はちょうど辞書のような初期化が欲しいです。ジョンの答えはまさに私が必要なものです。私が持っている悪いのは、新しいタイプを定義することです。 – Poma

答えて

9

EDIT:それは、.NET が判明はすでに組み合わせリスト/辞書の種類を持っているん:OrderedDictionary。残念ながら、これは非ジェネリック型なので、私の見解ではそれほど魅力的ではありません。ただし、Addを繰り返し呼び出すだけで、広告掲載オーダーは保持されます。

それはAddの呼び出しと少し奇妙だ、キー/値のペアを追加するためにインデクサーを使用すると、以前の関連付けを上書きするのに対しは、キーがすでに存在するエントリには影響を与えませありません。基本的にはひどくいいAPI​​のようには思えません。あなたのユースケースが正確にの動作と一致しない限り、私は個人的にそれを避けています。


いいえ、.NETには挿入順保留辞書がありません。関連するAddメソッドを使用して、常に独自のリストベースの型を書くことができます。その後

public class KeyValueList<TKey, TValue> : List<KeyValuePair<TKey, TValue>> 
{ 
    public void Add(TKey key, TValue value) 
    { 
     Add(new KeyValuePair<TKey, TValue>(key, value)); 
    } 
} 

:これも、私は既存の型を拡張検討したい数少ない場所の一つかもしれません

var list = new KeyValueList<string, string> 
{ 
    { "key1", "value1"}, 
    { "key2", "value2"} 
}; 

代替組成物を使用することですが、私の直感は、このです継承の合理的な使用です。なぜ私はこのケースで満足しているのでしょうか?通常はそうではありません。

+0

もちろん、それは[CA1002](http://msdn.microsoft.com/en-us/library/ms182142)を使用してコード分析を狂わせます。aspx)も実装していません。またIDictionary

+0

を実装しています@ローランド: 'KeyValueList'型自体を意味しますか?あなたは常に警告を抑制することができます。もちろんKeyValueList型の*プロパティなどを公開したくないかもしれません。 –

+0

@ローランド:OPが実際に辞書を求めていることは全くわかりません。辞書のように*初期化することができるようにしたいのですが、質問の始めから: "実際にはリスト<...>が必要です" –

2

辞書がないため、辞書イニシアチザーを使用できません。あなたが得ることができる最も近いだろうリストの初期化子を使用することができますので、あなたは、リストを持っている:ここでは

var l = new List<KeyValuePair<string, string>> 
{ 
    new KeyValuePair<string, string>("key1", "value1"), 
    new KeyValuePair<string, string>("key2", "value2"), 
}; 

あなたは辞書初期化子を使用するための最小要件です:クラスはIEnumerableを実装する必要がありますし、クラスは、パブリックを持っている必要がありますメソッドAddは2つの引数をとります(最初の引数はキーを表し、2番目の引数は値を表します)。したがって、これらの要件を満たすカスタムクラスを書くことができ、あなたの質問に表示されている構文を使用できるようになります。

+0

Up-voted私はリストを作成して、構文的な砂糖を得るための余分なAddメソッドを用意しています。 – Craig

0

入力したコードは、Mads Togersenのpostに、コレクションの初期化子の実装に関してうまく機能します。同じ記号(この場合はDictionary.Add(TKey, TValue))を持つコレクションのAddメソッドに、中括弧で区切られたエントリ(上記の{"key1", "value1"})を追加します。

+0

しかし、それはOPが望んでいる挿入順を保持しません。 –

関連する問題