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