2011-12-31 17 views
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

什麼是「結果[你]想要」?有鋸齒陣列?創建一個匿名類型列表?... – 2011-12-31 01:46:20

+0

冒着明顯的風險,你可以做'var result = new [] {「dog」,「cat」,「fish」,「frog」};'但是如果你必須從元組列表開始,那麼你看起來很棒。 – 2011-12-31 01:49:57

+0

@jmh_gr - 我只是爲了清晰起見編輯了這個問題。我想要一個由'originalListFirstItem.StringProperty1','originalListFirstItem.StringProperty2','originalListSecondItem.StringProperty1','originalListSecondItem.StringProperty2'等組成的'IEnumerable '等。 – TrueWill 2011-12-31 01:52:32

回答

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 2012-01-01 17:27:57

+0

@TrueWill - 我已經更新了我的答案。 – 2012-01-02 07:08:43

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方法:

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

在這兩種情況下,創建一個新的List<string>

+1

+1,特別適合使用Aggregate! – TrueWill 2011-12-31 02:24:07