用LINQ将select中两列的结果合并到一个数组中?

Posted

技术标签:

【中文标题】用LINQ将select中两列的结果合并到一个数组中?【英文标题】:Combine the results of two columns in a select into one array with LINQ? 【发布时间】:2012-08-01 20:30:01 【问题描述】:

基本上,我希望选择两个字符串列并将其全部放入单个字符串数组中。现在我必须做两次选择并结合结果。这不是什么大不了的事,我只是觉得它看起来很尴尬。关于如何使用一个 linq 语句实现相同目标的任何建议?这是我用来乱七八糟的测试用例:

[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());
    
  

【问题讨论】:

清晰漂亮,看不出有什么理由在这里老老实实改。 您的断言将失败,因为.Union() 删除了重复项。也许你想要.Concat() 我不知道 .Union() 删除重复项。 【参考方案1】:

使用SelectMany 的替代解决方案(它保留重复项):

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

【讨论】:

这很有趣。这给了我想要的结果,但不是我所期望的。我以为它会给我组合。Count() == 2。猜不出来。 SelectMany 基本上将给定的多个集合“扁平化”为一个集合。【参考方案2】:

列表中字符串的最终排序是否重要?如果没有,这似乎是完成此任务的最清晰方法:

var strings = new List<String>();
foreach (var value in list.Where(c => c.Flag))

    strings.Add(value.Present);
    strings.Add(value.Previous);

【讨论】:

以上是关于用LINQ将select中两列的结果合并到一个数组中?的主要内容,如果未能解决你的问题,请参考以下文章

sql server 中有一张表,我想把表中两列的数据合并后插入本表中另一列!请问怎么实现

我需要得到每行中两列的差之和[关闭]

将函数应用于 Pandas.DataFrame 中两列的每个组合的更好方法

如何excel表格中两列匹配后自动嵌套数据

如何将 DataFrame 中两列中的两个日期和时间合并为一列? [复制]

EXCEL中如何将两列的内容合并到一列中?