2012-08-01 133 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); 
} 
相关问题