首页 > 解决方案 > 将一行中的重复项整理出来,但保留一个特定的

问题描述

我想要做的是,对于一列是不同的(或分组依据),但随后将其保留在我的列表中,该列具有第二列的值。

是)我有的

Column1 Column 2 Column3 ...
   1   |  tada  | smth
   1   |        | wefih
   2   |  tada  | uitethgev
   3   |        | urifnvf

what i want
Column1 Column 2 Column3 ...
   1   |  tada  | smth
   2   |  tada  | uitethgev
   3   |        | urifnvf

因为我只有一个“3”,所以我想把它放在我的列表中。2 相同,但 1 应该只保留 column2 中的值。

我想在 linq 查询中执行此操作。每一行都是一个具有代表列的属性的对象。这有什么线索吗?我知道如何通过使用多个列表并通过检查它的方法相互写入来实现它。但我认为可能有一个很好的 linq 方法来做到这一点。还请记住,我有更多的不仅仅是 3 列。

标签: c#linq

解决方案


你可以这样做linq,特别是GroupBy为什么不这样做:

1 - 我正在创建一个class模拟您的需求:

public class TestClass
{
    public int Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
}

2 - 我正在初始化TestClass如下列表:

List<TestClass> testClasses = new List<TestClass>
{
    new TestClass{Column1 = 1, Column2 = "tada", Column3 = "smth"},
    new TestClass{Column1 = 1, Column2 = "msa", Column3 = "msa1"},
    new TestClass{Column1 = 1, Column3 = "wefih"},
    new TestClass{Column1 = 2, Column2 = "tada", Column3 = "uitethgev"},
    new TestClass{Column1 = 3, Column3 = "urifnvf"},
};

3 -groupBy用于过滤您的列表,通过测试count分组元素是否大于或等于2

if count >= 2column2 :取第一个不为空的元素

else : 取元素而不过滤

List<TestClass> groupedList = testClasses
    .GroupBy(x => x.Column1)
    .Select(y => y.Count() >= 2 ? y.First(z => !string.IsNullOrEmpty(z.Column2)) : y.First())
    .ToList();

3 的结果:

  Column1|Column 2| Column3 ...
  1      |  tada  | smth
  2      |  tada  | uitethgev
  3      |        | urifnvf

4 - 如果您需要全部不column2为空,如果count大于2,请尝试以下代码:

List<TestClass> groupedList = testClasses
    .GroupBy(x => x.Column1)
    .SelectMany(y => y.Count() >= 2 ? y.TakeWhile(z => !string.IsNullOrEmpty(z.Column2)) : y)
    .ToList();

4的结果:

  Column1|Column 2| Column3 ...
  1      |  tada  | smth
  1      |  msa   | msa1
  2      |  tada  | uitethgev
  3      |        | urifnvf

我希望这会给你一个答案


推荐阅读