Dictionary <TKey, TValue> girişleri için koleksiyon başlatıcı kullanabilir miyim?


94

Sonraki kod parçası için bir koleksiyon başlatıcı kullanmak istiyorum:

public Dictionary<int, string> GetNames()
{
    Dictionary<int, string> names = new Dictionary<int, string>();
    names.Add(1, "Adam");
    names.Add(2, "Bart");
    names.Add(3, "Charlie");
    return names;
}

Bu nedenle tipik olarak şöyle bir şey olmalıdır:

return new Dictionary<int, string>
{ 
   1, "Adam",
   2, "Bart"
   ...

Ama bunun için doğru sözdizimi nedir?




Bunun bir dupe olduğunu düşünmeyin, çünkü kestirme sözlük bildirimi sözdizimi için değil, neden steno'nun (eski) düzenlerinde işe yaramadığını soruyorlardı.
NH.

Yanıtlar:


157
var names = new Dictionary<int, string> {
  { 1, "Adam" },
  { 2, "Bart" },
  { 3, "Charlie" }
};

1
Başlatıcı ne zaman çalışır? Sadece Dictionary<TKey, TValue>alt sınıflar için ICollection<KeyValuePair<TKey, TValue>>mi yoksa üzerinde de çalışacak mı?
Shimmy Weitzhandler

C # 3.0'dan sonra var, bildirme türü yerine kullanabilirsiniz veya new Dictio...
bildirim

1
@drzaus: var kullanmak çirkin, çirkin bir uygulamadır; C # güçlü bir şekilde yazılmış bir dildir.
Nyerguds

1
@Nyerguds: ne? varkelimenin tam anlamıyla sadece tuş vuruşlarını kurtarır, dolaylı olarak güçlü bir şekilde yazılır .
drzaus

4
@Nyerguds - fikrinize hakkınız var sanırım, ancak değişkenlerinizi hemen başlatıyorsanız, varkendinizi kullanmakla tekrar etmek arasında kelimenin tam anlamıyla bir fark yoktur SomeType obj = new SomeType.... Ve var obj;hemen başlatmadan beyan edemeyeceğiniz için, sorunu görmüyorum. Gerçekten öğrenmeye çalışıyorum ama pozisyonunu alamıyorum.
drzaus

36

Sözdizimi biraz farklıdır:

Dictionary<int, string> names = new Dictionary<int, string>()
{
    { 1, "Adam" },
    { 2, "Bart" }
}

Etkili bir şekilde değer demetleri eklediğinizi unutmayın.

Bir yan not olarak: koleksiyon başlatıcıları, temelde , derleme zamanı türü bağımsız değişkenle ilgili olarak kullanışlı olan Add () işlevi için bağımsız değişkenler olan bağımsız değişkenler içerir. Yani bir koleksiyonum varsa:

class FooCollection : IEnumerable
{
    public void Add(int i) ...

    public void Add(string s) ...

    public void Add(double d) ...
}

aşağıdaki kod tamamen yasaldır:

var foos = new FooCollection() { 1, 2, 3.14, "Hello, world!" };

Harika cevap, bunu bilmiyordum! Her neyse, sözlük başlatıcı ne zaman çalışıyor? Yalnızca Dictionary <TKey, TValue> alt sınıfları için mi yoksa ICollection <KeyValuePair <TKey, TValue >> üzerinde de çalışacak mı?
Shimmy Weitzhandler

@Shimmy Collection başlatıcıları , yöntemleri uygulayan IEnumerable ve bunlara sahip olan her şey üzerinde çalışır Add().
Anton Gogolev

@Shimmy: sözlükler koleksiyondur
John Saunders

@JohnSaunders Ancak bir sözlük başlatıcı için iki parametre kabul eder Add.
Shimmy Weitzhandler

2
@Shimmy: Bu neden önemli? Önemli olan, uygulayan ve bir yöntemi olan herhangi bir sınıfla çalışacak olmasıdır . Eğer yöntem alır 3 parametreleri, o zaman parantez içinde 3 nesneleri gerekir. IEnumerable<T>AddAdd
John Saunders

11
return new Dictionary<int, string>
{ 
   { 1, "Adam" },
   { 2, "Bart" },
   ...

10

Soru etiketlenmiştir c#-3.0, ancak eksiksiz olması için Visual Studio 2015 (veya Mono 4.0) kullanıyorsanız C # 6 ile kullanılabilen yeni sözdiziminden bahsedeceğim:

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie"
};

Not: Diğer yanıtlarda bahsedilen eski sözdizimi, daha çok hoşunuza gidiyorsa, yine de çalışır. Yine tamlık için eski sözdizimi şöyledir:

var dictionary = new Dictionary<int, string>
{
   { 1, "Adam" },
   { 2, "Bart" },
   { 3, "Charlie" }
};

Unutulmaması gereken bir başka güzel şey de, her iki sözdizimiyle, isterseniz son virgül bırakabilirsiniz, bu da ek satırları kopyalamayı / yapıştırmayı kolaylaştırır. Örneğin, aşağıdaki derlemeler gayet iyi:

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie",
};

5

Biraz daha az ayrıntılı sözdizimi arıyorsanız, bunun gibi bir alt sınıf Dictionary<string, object>(veya türünüz ne olursa olsun) oluşturabilirsiniz:

public class DebugKeyValueDict : Dictionary<string, object>
{

}

O zaman böyle başlat

var debugValues = new DebugKeyValueDict
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });

Eşdeğeri

var debugValues = new Dictionary<string, object>
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });

Bunun yararı, söyleyebilmek gibi isteyebileceğiniz tüm derleme türü şeyleri elde etmenizdir.

is DebugKeyValueDict onun yerine is IDictionary<string, object>

veya anahtar veya değer türlerini daha sonraki bir tarihte değiştirmek. Bir jilet cshtml sayfasında bunun gibi bir şey yapıyorsanız, bakmak çok daha hoş olur.

Daha az ayrıntılı olmanın yanı sıra, elbette bu sınıfa istediğiniz her şey için ekstra yöntemler ekleyebilirsiniz.


ViewDataDictionary temelde MVC'de nasıl çalışır - stackoverflow.com/questions/607985/…
Simon_Weaver

Türleri Sözlükler ve dizilmiş diziler için 'takma adlar' olarak denedim, önceden tanımlanmış türleri kullanmanın daha güvenli olacağını varsayarak yazılmış bir dünyada .. Jenerikler ve linq söz konusu olduğunda bu kadar kullanışlı olmadığı ortaya çıktı.
Patrick

1

Aşağıdaki kod örneğinde, a Dictionary<TKey, TValue>, tür örnekleriyle başlatılır StudentName.

  Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
  {
      { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}},
      { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}},
      { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}
  };

dan msdn


-3

Evet, sözlükte koleksiyon başlatıcı kullanabiliriz, böyle bir sözlüğümüz varsa-

Dictionary<int,string> dict = new Dictionary<int,string>();  
            dict.Add(1,"Mohan");  
            dict.Add(2, "Kishor");  
            dict.Add(3, "Pankaj");  
            dict.Add(4, "Jeetu");

Aşağıdaki gibi başlatabiliriz.

Dictionary<int,string> dict = new Dictionary<int,string>  
            {  

                {1,"Mohan" },  
                {2,"Kishor" },  
                {3,"Pankaj" },  
                {4,"Jeetu" }  

            }; 

4
Bunun nasıl yapılacağını gösteren 6 cevap daha var. Aynı şeyi gösteren 7. cevaba ihtiyacımız yok.
17:15
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.