2016-03-30 19 views
2

Koleksiyon List<dynamic> dList yaşıyorum. Bu, string öğeler ve List<string> öğeler var. Şimdi tüm değerleri tek bir Listede organize etmem gerekiyor. 1Convert List <dynamic> LINQ kullanarak listele

List<dynamic> dList = new List<dynamic>() 
{ 
    "Selva", 
    new List<string>() {"Bala"}, 
    new List<string>() {"Prayag", "Raj"}, 
    "Pavithran" 
}; 

Olgu: 2

List<object> bala = new List<dynamic>() 
{ 
    "Selva", 
    new List<object>() {"Bala"}, 
    new List<object>() {"Prayag", "Raj"}, 
    "Pavithran" 
}; 

yukarıdaki iki Listesinin Çıktı olan

Sadece List<dynamic> Dlist

Vaka bakınenter image description here

My Beklenen Çıktı

enter image description here

nasıl yukarıdaki List<dynamic> beklenen sonucun elde edebiliriz nedir? Liste çalışma zamanında üretilir ve yapıyı değiştiremiyorum.

Bu karmaşık bir Linq sorgunun küçük bir kısmıdır, bu yüzden bunu Linq'de gerçekleştirmem gerekiyor. elementlerin sırası önemli değilse

+0

Neden hedefe ulaşmak için Linq kullanmak gerekiyor? –

+0

Ana projemde Karmaşık Linq Sorgusu içinde küçük bir bölümdür. Yani, bunu LINQ'da başarmalıyım. Aksi takdirde foreach loop ve diğer temel sözdizimini kullanarak başarabiliriz ... –

cevap

5

sipariş sonra bu dümdüz sonra List<string> her eleman dönüştürmek ve önemli ise: kullanmak ...

List<dynamic> dList = new List<dynamic>() 
{ 
    "Selva", 
    new List<string>() {"Bala"}, 
    new List<string>() {"Prayag", "Raj"}, 
    "Pavithran" 
}; 

var flattenedList = dList.SelectMany(d => 
{ 
    if (d is string) 
    { 
     return new List<string>() { d }; 
    } 
    else if (d is List<string>) 
    { 
     return (d as List<string>); 
    } 
    else 
    { 
     throw new Exception("Type not recognised"); 
    } 
}); 

Veya, hiçbir tür denetimi ile seksi bir-liner olarak (böylece senin kendi riski) nihayet

dList.SelectMany(d => d as List<string> ?? new List<string>() { d }) 

Veya, LINQ sözdiziminde:

var newList = 
    (from d in dList 
    from d2 in EnsureListOfString((object)d) 
    select d2 
    ); 

public List<string> EnsureListOfString(object arg) 
{ 
    List<string> rtn = arg as List<string>; 

    if (rtn == null) 
    { 
     if (arg is string) 
     { 
      rtn = new List<string>() { arg as string }; 
     } 
     else 
     { 
      throw new Exception("Type not recognised."); 
     } 
    } 

    return rtn; 
} 
+0

Katkınız için teşekkürler. Şimdi bir tane daha soru ile Sorguyu düzenledim ... Lütfen bana yardımcı olun, Vakada nasıl elde edebilirim: 2 veri –

+1

@VikasGupta Fuar noktası - şimdi yeni LINQ iyiliği ile :) –

+0

@IRPunch Aynı olmalıdır (değiştirmeden hariç "string" den "object" ve "List " ile "" listelenmesi için ilgili dökümanlar. Özel bir zorluğun var mı? –

1

, bunu yapabilirsiniz:

dList.OfType<string>().Concat(dList.OfType<List<string>>().SelectMany(l => l)); 

listeden tüm string elemanları bu ilk seçer, sonra tüm List<string> unsurları seçer ve SelectMany kullanarak bunları düzleştiren ve nihayet bütün concats Teller.

İlgili konular