web-gelistirme-sc.com

Anahtar değer çiftlerinin bir listesi için nesne başlatıcıları nasıl kullanırsınız?

Şunun için satır içi toplama başlatması yapacak sözdizimini bulamıyorum:

var a = new List<KeyValuePair<string, string>>();
37
loyalflow

Oldukça basit:

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"),
};

Son öğeden sonra takip eden virgülden çıkabileceğinizi unutmayın (muhtemelen .net yaratıcıları otomatik kod oluşturmayı kolaylaştırmak istedi) veya liste yapılandırıcısının () braketlerini kaldırabilir ve kod hala derlenir.

60
digEmAll

Sözlük koleksiyonu başlatma { { key1, value1 }, { key2, value2 } } öğesinin, sözlüğün Add(TKey, TValue) yöntemine bağlı olduğunu unutmayın. Bu sözdizimini listede kullanamazsınız çünkü bu yöntemden yoksundur, ancak bu yöntemle bir alt sınıf oluşturabilirsiniz:

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" },
                   };
    }
}
69
phoog

Alt sınıf oluşturmayı gerektirmeyen başka bir alternatif:

List<KeyValuePair<String, String>> list = new Dictionary<String, String>
    {
        {"key1", "value1"},
        {"key2", "value2"},
    }.ToList();

Yorumlarda belirtildiği gibi: Bu yöntemle ilgili dezavantajlar olası sipariş kaybını ve yinelenen anahtarların eklenememesini içerir.

6
elRobbo

Koleksiyon başlatıcıları (C # 6.0) burada belirtilmediğinden:

Uygulama

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

Kullanım

var list = new List<KeyValuePair<string, string>> { {"ele1item1", "ele1item2"}, { "ele2item1", "ele2item2" } };

Nasıl çalıştırılır

Dosyanıza using ifadesinin kullanılabilmesi için doğru InitializerExtensions ifadelerini eklemeniz yeterlidir (yani InitializerExtensions.Add öğesini çağırabilirsiniz.) Ve VS 2015 veya üstü kullanıyorsanız, özel koleksiyon başlatıcı sözdizimi kullanılabilir hale gelir.

4
user764754

Herhangi bir başlatma object(params_if_exist) { any public member or instance}; tarafından yapılır.

f. E. var list = new List<int> {1,2,3};

var bw = new BackgroundWorker() {WorkerSupportsCancellation = true};

0
burning_LEGION