2016-03-30 8 views
2

私はコレクションを持っていますList<dynamic> dList。その中には、のアイテムとList<string>のアイテムがあります。今私は単一のリストのすべての値を整理する必要があります。 1リストを<dynamic>に変換するLINQを使用してリスト

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

ケース:2

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

上記の2つのリストの出力がある

ちょうどList<dynamic> DLIST

ケースを参照してください。enter image description here

私の予想される出力は、どのように私は上記List<dynamic>から期待される結果を達成できる

enter image description here

のですか?リストは実行時に生成され、構造を変更することはできません。

これは複雑なLinqクエリの小さな部分ですので、Linqでこれを達成する必要があります。

+0

あなたがあなたの目標を達成するためにLINQを使用しなければならないのはなぜ? –

+0

これは、メインプロジェクトの複雑なLinqクエリ内の小さなパーティションです。だから、私はLINQでこれを達成する必要があります。さもなければ、foreachループと他の基本的な構文を使用して達成することができます... –

答えて

5

順序が重要であるなら、あなたはList<string>にすべての要素を変換し、これらのフラット化することができます:いいえ型チェック(とセクシーなワンライナーとして

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

か、をので...あなたの使用自己責任)LINQの構文では、最終的

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

または、:!

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

あなたの貢献に感謝します。今度はもう1つのケースで質問を編集しました。親切に私を助けてください。どうすれば達成できますか?2データ –

+1

@VikasGuptaフェアポイント - 新しいLINQの良さで:) –

+0

@IRPunch関連する 'string'から' object'へのキャスト、 'List 'から 'List 'へのキャスト)。特に困っていますか? –

1

要素の順序が重要でない場合は、あなたがこれを行うことができます:

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

この最初の選択リストからすべてのstringの要素を、すべてのList<string>の要素を選択し、SelectManyを使用してそれらを平らにし、最終的にすべてのconcats文字列。

関連する問題