2012-08-01 132 views
3

基本上我正在尋找選擇兩個字符串列,並把它放到一個單一的字符串數組。現在我不得不做兩個選擇併合並結果。這不是一個大問題,我認爲它看起來很尷尬。有關如何用一個linq語句完成相同目標的任何建議?下面是我用來測試的測試用例:將使用LINQ的select中的兩列結果合併到一個數組中?

[TestFixture] 
    public class test { 

    public class Values { 
     public string Present { get; set; } 
     public string Previous { get; set; } 
     public bool Flag { get; set; } 
    } 

    [Test] 
    public void test1() { 

     var list = new List<Values> { 
     new Values { Present = "present1", Previous = "previous1", Flag = false }, 
     new Values { Present = "present2", Previous = "previous2", Flag = false }, 
     new Values { Present = "present3", Previous = "previous3", Flag = true }, 
     new Values { Present = "present4", Previous = "previous4", Flag = true } 
     }; 


     var r1 = list.Where(c => c.Flag).Select(c => c.Present); 
     var r2 = list.Where(c => c.Flag).Select(c => c.Previous); 
     var combined = r1.Concat(r2); 

     Assert.AreEqual(4, combined.Count()); 
    } 
    } 
+1

很清晰美觀,不看到有什麼理由誠實地在這裏改變任何事情。 – Tigran 2012-08-01 20:32:00

+0

您的斷言將失敗,因爲'.Union()'刪除重複項。也許你想['.Concat()'](http://msdn.microsoft.com/en-us/library/bb302894.aspx)? – gilly3 2012-08-01 20:35:19

+0

我不知道.Union()刪除重複項。 – 2012-08-01 20:38:32

回答

7

使用SelectMany另一種解決方案(它不斷重複的):

var combined = list.Where(c => c.Flag) 
        .SelectMany(c => new[] { c.Present, c.Previous }); 
Assert.AreEqual(4, combined.Count()); 
+0

這很有趣。這給了我想要的結果,但不是我所期望的。我認爲這會給我combined.Count()== 2.猜不。 – 2012-08-01 20:45:57

+1

[SelectMany](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.selectmany.aspx)基本上將給定的多個集合「展平」爲一個集合。 – nemesv 2012-08-01 20:47:12

0

列表中的字符串的最終排序是否很重要?如果沒有,好像這將是實現這一目標的最清晰的方式:

var strings = new List<String>(); 
foreach (var value in list.Where(c => c.Flag)) 
{ 
    strings.Add(value.Present); 
    strings.Add(value.Previous); 
} 
相關問題