2016-06-26 3 views
0

私は、文字列、またはの文字列を含むオブジェクトのリストを持っています。私は "平坦化された"文字列のリストを抽出しようとしています。私には解決策がありますが、私はよりよい方法を見つけようとしています。異なる深さの文字列のリストを条件付きで平坦化するためのLinq

class Foo 
{ 
    public bool IsArray { get; set; } 
    public object Values { get; set; } 
} //...  

var innerList = new List<string> {"Inner111", "Inner222"} 

var fooList = new List<Foo>(); 
fooList.Add(new Foo { IsArray = false, Values = "simpleVaue" }); 
fooList.Add(new Foo { IsArray = false, Values = innerList }); 

私の望ましい結果::私はいくつかの異なるLINQの方法を試してみた

["simpleVale","Inner111","Inner222"] 

、選択SelectMany、集計、ここで

は、入力を作成するための簡単な手順です。 ..

var outputListWithWastefulListCreation = 
fooList.SelectMany<Foo, string>(z => 
{ 
    if (!z.IsArray) 
    { 
     var wastefulList = new List<string> {z.Values.ToString()}; 
     return wastefulList; 
    } 
    var listObject = (IEnumerable<string>) z.Values; 
    return listObject; 
}); 

ここでも、私の望ましい結果

["simpleVale","Inner111","Inner222"] 

私はより良い方法がなければならないと確信していますか?

答えて

0

あなたはSelectMany内のコレクションに単一の値を変換しようとすることができます

var result = fooList 
    .SelectMany(item => item.IsArray 
     ? item.Values as List<String> 
     : new List<String>() {item.Values as String}); 

別、および、IMHO、より良い可能性がIEnumerable<String> GetValues()' method in the foo`クラスを実装することです:

class Foo 
{ 
    public bool IsArray { get; set; } 
    public object Values { get; set; } 

    public IEnumerable<String> GetValues() 
    { 
     if (null == values) 
      yield break; 

     List<String> list = Values as List<String>; 

     if (list != null) 
      foreach (var item in list) 
       yield return item; 
     else 
      yield return Values as String; 
    } 
} 

ので、ちょうど入れることができます

var result = fooList 
    .SelectMany(item => item.GetValues()); 
0

以下試してください:

fooList.SelectMany<Foo, string>(z => z.IsArray ? ((List<string>) z.Values) : new List<string>() {(string) z.Values}); 

しかし、最初に行うべきこと - あなたのFooクラスのデザインがOKであるかどうかを考えることですか、あなたは、このようなトリッキーな問題を回避するために、(1つの文字列とリストについては、おそらく2つの異なるクラスで)それを変更することができます。

関連する問題