我有一个包含5列的数据表,我需要找到每2列唯一组合的最大日期。
正在寻找有关如何完成操作的指南,因此尚未尝试任何操作。我会串联2个列的值并将其用作唯一值以提取最大记录吗?这是我迷失在如何最好地完成这项任务的地方
这是一个带有相关列的简单数据表
Column 1 Column 2 Column 3 Column 4 Column 5
2 4/25/2019 25
2 3/25/2019 26
2 2/15/2019 25
Column 1 Column 2 Column 3 Column 4 Column 5
2 4/25/2019 25
2 3/25/2019 26
如果我针对这3条记录运行筛选器,我希望会收到2条以上的记录。
原因是我需要Column 1
和Column 3
唯一,然后我只希望日期最长。
答案 0 :(得分:1)
我认为您正在寻找这个东西:
DataTable dt = new DataTable();
dt.Columns.Add("Col1", typeof(int));
dt.Columns.Add("Col2", typeof(DateTime));
dt.Columns.Add("Col3", typeof(int));
dt.Rows.Add(2, DateTime.Parse("2/15/2019"), 25);
dt.Rows.Add(2, DateTime.Parse("5/25/2019"), 25);
dt.Rows.Add(2, DateTime.Parse("3/25/2019"), 26);
dt.AsEnumerable()
.GroupBy(r => new {col1 = r.Field<int>("Col1"), col2 = r.Field<int>("Col3")} )
.Select(g =>
g.Select(s=> s).OrderByDescending(o=>o.Field<DateTime>("Col2")).FirstOrDefault()
);
答案 1 :(得分:0)
您可以使用LINQ来实现自己的目标:
// foos.GroupBy(c => c.Number)
.Select(c => c.OrderByDescending(b => b.Date).Take(1))
.SelectMany(c => c).ToList();
// as pointed out by @Flater, using `Take(1)` will return an `IEnumerable<T>`
// which requires unnecessary flattening through `SelectMany()`.
// instead, use .First() to take off the top of the ordered collection
foos.GroupBy(c => c.Number)
.Select(c => c.OrderByDescending(b => b.Date).First());
这将通过名为Number
的属性Column3
对每个项目进行分组。然后它将从每个组中获取日期最高的项目,然后将其展平到您的实体类型列表。
答案 2 :(得分:0)
正如@mariocatch所说,您可以使用group by-您可以使用此技术在多个列中创建唯一键:
group x by new { x.Column1, x.Column3 }
或
GroupBy(x => new { x.Column1, x.Column3 })
您的结果将如下所示:
foos.GroupBy(x => new { x.Column1, x.Column3 })
.Select(x => x.OrderByDescending(y => y.Date).First()