C# 在一行中整理重复项,但保留特定项

C# 在一行中整理重复项,但保留特定项,c#,linq,C#,Linq,我想做的是,对一列进行区分(或分组),然后在列表中保留第二列的值 我所拥有的 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

我想做的是,对一列进行区分(或分组),然后在列表中保留第二列的值

我所拥有的

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应仅保留第2列中的值

我想在linq查询中这样做。每一行都是一个对象,其属性表示列。
有什么线索吗?我知道如何通过使用多个列表并通过检查方法相互写入来实现。但我认为有一个很好的linq方法可以做到这一点。还请记住,我有3列以上的内容。

以下linq有效:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Column1", typeof(int));
            dt.Columns.Add("Column2", typeof(string));
            dt.Columns.Add("Column3", typeof(string));

            dt.Rows.Add(new object[] { 1, "tada", "smth"});
            dt.Rows.Add(new object[] { 1, null, "wefih"});
            dt.Rows.Add(new object[] { 2, "tada", "uitethgev"});
            dt.Rows.Add(new object[] { 3, null, "erifnvf"});

            DataTable dt2 = dt.AsEnumerable()
                .GroupBy(x => x.Field<int>("Column1"))
                .Select(x => x.All(y => (y.Field<object>("Column2") == null)) ? x.First() : x.Where(y => y.Field<object>("Column2") != null).First())
                .CopyToDataTable();

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
添加(“第1列”,类型(int));
dt.Columns.Add(“Column2”,typeof(string));
dt.Columns.Add(“Column3”,typeof(string));
Add(新对象[]{1,“tada”,“smth”});
Add(新对象[]{1,null,“wefih”});
Add(新对象[]{2,“tada”,“uitethgev”});
Add(新对象[]{3,null,“erifnvf”});
数据表dt2=dt.AsEnumerable()
.GroupBy(x=>x.Field(“Column1”))
。选择(x=>x.All(y=>(y.Field(“Column2”)==null))?x.First():x.Where(y=>y.Field(“Column2”)!=null)。First()
.CopyToDataTable();
}
}
}

您可以通过
linq
来完成,特别是通过
GroupBy
为什么不:

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

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:

4-如果需要所有非空
列2
,如果
计数大于
2
,请尝试以下代码:

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

我希望这会给你一个答案

看看
GroupBy
我认为GroupBy不是我的解决方案的答案,因为我仍然缺少“分组时始终保留有价值的一个”的条件。是的,似乎你是对的,我只是不知道高级分组,所以也谢谢你:)很遗憾,它没有起作用。它只显示结果。这一个真的很好。非常感谢,这对我很有帮助。你的解决方案很干净。非常感谢你!
  Column1|Column 2| Column3 ...
  1      |  tada  | smth
  2      |  tada  | uitethgev
  3      |        | urifnvf
List<TestClass> groupedList = testClasses
    .GroupBy(x => x.Column1)
    .SelectMany(y => y.Count() >= 2 ? y.TakeWhile(z => !string.IsNullOrEmpty(z.Column2)) : y)
    .ToList();
  Column1|Column 2| Column3 ...
  1      |  tada  | smth
  1      |  msa   | msa1
  2      |  tada  | uitethgev
  3      |        | urifnvf