是否需要过滤2列的数据表以创建唯一组合?

时间:2019-06-28 13:14:31

标签: c# linq datatable filtering

我有一个包含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 1Column 3唯一,然后我只希望日期最长。

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