C # Listeyi <string> Sözlüğe Dönüştür <string, string>


117

Bu, yapmak isteyeceği garip bir şey gibi görünebilir, ancak bunu göz ardı ederek, bir Listeyi Sözlüğe dönüştürmenin güzel ve kısa bir yolu var mı? yani

List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3

Pek çok araştırma yaptım ve Stackoverflow'da tek başına bunu ters yönde yapmanın tam anlamıyla düzinelerce örneği var, ancak bu şekilde değil.

Bunu yapmamın nedeni iki adet üçüncü parça bileşenim olması ve bunları değiştirmek benim elimde olmaması. Biri e-posta adreslerinin bir listesini Liste olarak döndürür ve diğeri Kime parametresinin Sözlük olduğu e-postaları gönderir. Sözlüğün anahtarı e-posta adresidir ve değeri gerçek adıdır. Ancak, gerçek adı bilmiyorum, ancak gerçek adı e-posta adresine de ayarlarsanız yine de çalışır. Bu yüzden neden bir Listeyi Sözlüğe dönüştürmek istiyorum. Bunu yapmanın birçok yolu var. Listedeki bir sözlüğe bir kvp ekleyen bir foreach döngüsü. Ama kısa kodu severim ve tek satırlık bir çözüm olup olmadığını merak ettim.


1
Geçerli sebebiniz için daha iyi bir çözümüm var, dürüst.

2
Dictionary <,> kullanmak yerine HashSet <> gereksinimlerinizi karşılayıp karşılamadığını görmek isteyebilirsiniz.
Greg

Yukarıdaki yorumculardan daha doğrudan: Bunu istemenizin nedenini açıklarsanız, birisi muhtemelen daha iyi bir çözüm önerebilir.
Tim S.

1
Daha iyi bir çözüm yok. E-posta adresleri olan dizelerin bir listesini döndüren üçüncü taraf bir bileşenim var. Anahtarın e-posta adresi ve değerin alıcıların gerçek adı olduğu bir Dictionary <string, string> ilettiği yerde e-postalar gönderen başka bir üçüncü taraf bileşenim var. Ancak, gerçek ad aynı zamanda yine e-posta adresi de olabilir, bu yüzden List <string> 'i Sözlük <string, string>' e dönüştürmek istiyorum
Jonnster

Yanıtlar:


244

Bunu dene:

var res = list.ToDictionary(x => x, x => x);

İlk lambda anahtarı seçmenize izin verir, ikincisi değeri seçer.

Onunla oynayabilir ve aşağıdaki gibi tuşlardan farklı değerler yapabilirsiniz:

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x));

Listeniz kopyalar içeriyorsa, şöyle ekleyin Distinct():

var res = list.Distinct().ToDictionary(x => x, x => x);

DÜZENLE Geçerli neden hakkında yorum yapmak gerekirse, bunun gibi dönüşümler için geçerli olabilecek tek nedenin, bir noktada ortaya çıkan sözlükteki anahtarların ve değerlerin farklılaşması olduğunu düşünüyorum. Örneğin, bir ilk dönüştürme yaparsınız ve ardından bazı değerleri başka bir şeyle değiştirirsiniz. Anahtarlar ve değerler her zaman aynı olacaksa, HashSet<String>durumunuza çok daha iyi uyum sağlar:

var res = new HashSet<string>(list);
if (res.Contains("string1")) ...

liste string1, string2, string3, string1 şeklindeyse bu başarısız olur
Pranay Rana

3
@PranayRana Evet, olur. Bundan kaçınmak için .Distinct()sonrasına ekleyebilirsiniz list.
dasblinkenlight

Teşekkürler. ToDictionary işlevini kaçırdım. Temelde aynı cevabı veren herkese teşekkürler. Herkese oy verdim ama sadece bir cevabı kabul edebilirim. Bu, Distinct kodu eklenmiş yalnızca biriydi, bu yüzden bence en eksiksiz olanıydı.
Jonnster

11

Bunu kullan:

var dict = list.ToDictionary(x => x);

Daha fazla bilgi için MSDN'ye bakın .

Pranay'in yorumlarda işaret ettiği gibi, listede bir öğe birden çok kez varsa bu başarısız olacaktır.
Özel gereksinimlerinize bağlı olarak var dict = list.Distinct().ToDictionary(x => x);, farklı öğelerin sözlüğünü almak için kullanabilir veya ToLookupbunun yerine kullanabilirsiniz :

var dict = list.ToLookup(x => x);

Bu ILookup<string, string>, temelde aynı olan bir döndürür IDictionary<string, IEnumerable<string>>, böylece altındaki her dizge örneğiyle birlikte farklı anahtarların bir listesine sahip olursunuz.


liste string1, string2, string3, string1 şeklindeyse bu başarısız olur
Pranay Rana

1

Kullanarak ToDictionary:

var dictionary = list.ToDictionary(s => s);

Herhangi bir dizenin tekrar edilebilmesi mümkünse Distinct, listeden önce bir arama yapın (kopyaları kaldırmak için) veya ToLookupanahtar başına birden çok değere izin veren yöntemi kullanın .


0

Kullanabilirsiniz:

var dictionary = myList.ToDictionary(x => x);

0

DÜZENLE

kopya ile baş etmenin başka bir yolu da böyle yapabilmektir

var dic = slist.Select((element, index)=> new{element,index} )
            .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element);

veya


yapmanın kolay yolu

var res = list.ToDictionary(str => str, str=> str); 

ancak yinelenen bir dizi olmadığından emin olun ... aksi takdirde yukarıdaki kod sizin için çalışmayacaktır

eğer dizge tekrarlıysa, böyle yapmak daha iyidir

Dictionary<string,string> dic= new Dictionary<string,string> ();

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
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.