次のインラインコレクションの初期化を行うための構文がわかりません。
var a = new List<KeyValuePair<string, string>>();
Dictionaryコレクションの初期化は Dictionary のメソッド{ { key1, value1 }, { key2, value2 } }
に依存することに注意してください。Add(TKey, TValue)
リストにはそのメソッドがないため、この構文を使用することはできませんが、メソッドを使用してサブクラスを作成できます。
public class KeyValueList<TKey, TValue> : List<KeyValuePair<TKey, TValue>>
{
public void Add(TKey key, TValue value)
{
Add(new KeyValuePair<TKey, TValue>(key, value));
}
}
public class Program
{
public static void Main()
{
var list = new KeyValueList<string, string>
{
{ "key1", "value1" },
{ "key2", "value2" },
{ "key3", "value3" },
};
}
}
非常に簡単です:
var a = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("A","B"),
new KeyValuePair<string, string>("A","B"),
new KeyValuePair<string, string>("A","B"),
};
最後の要素の後に末尾のコンマを残すか(おそらく.net作成者が自動コード生成を簡単にしたかったため)、()
リストコンストラクターの角かっこを削除してもコードはコンパイルされることに注意してください。
サブクラスを作成する必要のない別の方法:
List<KeyValuePair<String, String>> list = new Dictionary<String, String>
{
{"key1", "value1"},
{"key2", "value2"},
}.ToList();
コメントで述べたように、この方法の欠点には、順序付けが失われる可能性と、重複キーを追加できないことが含まれます。
コレクション初期化子 (C# 6.0) はここでは言及されていないため:
実装
public static class InitializerExtensions
{
public static void Add<T1, T2>(this ICollection<KeyValuePair<T1, T2>> target, T1 item1, T2 item2)
{
if (target == null)
throw new ArgumentNullException(nameof(target));
target.Add(new KeyValuePair<T1, T2>(item1, item2));
}
}
使用法
var list = new List<KeyValuePair<string, string>> { {"ele1item1", "ele1item2"}, { "ele2item1", "ele2item2" } };
機能させる方法
VS 2015 以降を使用している場合はusing
、ファイルに適切なステートメントを含めるだけで使用できるようにInitializerExtensions
なり (つまり、明示的に呼び出すことができます)、特別なコレクション初期化構文が使用できるようになります。InitializerExtensions.Add
初期化はすべてobject(params_if_exist) { any public member or instance};
フェvar list = new List<int> {1,2,3};
var bw = new BackgroundWorker() {WorkerSupportsCancellation = true};