2011-12-31 8 views
2

興味のある2つのプロパティを持つオブジェクトの既存のコレクションがあります。両方のプロパティは同じ型です。私はプロパティ値からなる新しいシーケンスを作成したいと思います。ここでは(私が代わりに単純化のための私のカスタム型のタプルを使用しています)一つの方法です:中複数のプロパティ値で構成されるシーケンスを作成する

var list = new List<Tuple<string, string>> 
    { Tuple.Create("dog", "cat"), Tuple.Create("fish", "frog") }; 

var result = 
    list.SelectMany(x => new[] {x.Item1, x.Item2}); 

foreach (string item in result) 
{ 
    Console.WriteLine(item); 
} 

結果:

dog 
cat 
fish 
frog

は、これは私が望む結果が得られますが、より良い方法がありますこれを達成します(特に、配列やコレクションを作成する必要はありません)。

編集:

また、これは二回のコレクションを反復処理のコストで、動作します:

var result = list.Select(x => x.Item1).Concat(list.Select(x => x.Item2)); 
+0

"あなたが望む結果"とは何ですか?ギザギザの配列を持っている?匿名型のリストを作成していますか?... –

+0

明白なことを言う危険があります。var result = new [] {"dog"、 "cat"、 "fish"、 "frog"};あなたはタプルのリストから始めなければなりません。 –

+0

@jmh_gr - わかりやすく質問を編集しました。 'originalListFirstItem.StringProperty1'、' originalListFirstItem.StringProperty2'、 'originalListSecondItem.StringProperty1'、' originalListSecondItem.StringProperty2'などからなる 'IEnumerable 'が必要です。 – TrueWill

答えて

2

別のコレクションの作成を避けたい場合は、代わりに結果を得ることができます。

void Main() 
{ 
    var list = new List<Tuple<string, string>> 
     { Tuple.Create("dog", "cat"), Tuple.Create("fish", "frog") }; 

     foreach (var element in GetSingleList(list)) 
     { 
      Console.WriteLine (element); 
     } 
} 

// A reusable extension method would be a better approach. 
IEnumerable<T> GetSingleList<T>(IEnumerable<Tuple<T,T>> list) { 

    foreach (var element in list) 
    { 
     yield return element.Item1; 
     yield return element.Item2; 
    } 

} 
+0

*とても素敵です。私はこれを(a)新しい配列/コレクションを作成せず、(b)元のコレクションを一回しか反復しないように受け入れます。パラメータの型は 'IEnumerable >'でもかまいません。 – TrueWill

+0

@TrueWill - 私は自分の答えを更新しました。 –

2

私はあなたのアプローチは結構です、私はそれに固執するだろうと思います。配列の使用は、SelectManyを使用するとうまく処理され、最終結果はIEnumerable<string>になります。

いくつかの代替アプローチがありますが、私は彼らのアプローチよりも冗長であると思います。

Aggregateアプローチ:

var result = list.Aggregate(new List<string>(), (seed, t) => 
{ 
    seed.Add(t.Item1); 
    seed.Add(t.Item2); 
    return seed; 
}); 
result.ForEach(Console.WriteLine); 

ForEachアプローチ:新しいList<string>が作成され、両方のケースで

var result = new List<string>(); 
list.ForEach(t => { result.Add(t.Item1); result.Add(t.Item2); }); 
result.ForEach(Console.WriteLine); 

+1

+1、特にAggregate! – TrueWill

関連する問題