从DataTable中选择每个项目的最新结果

时间:2014-08-20 17:14:33

标签: c# visual-studio datatable

我有一个包含数千行的数据表。在表中有一个序列号列和一个测试号列。如果序列测试不止一个,则测试编号递增。我需要能够从我的数据表中为每个序列选择最新的测试并将其插入另一个数据表中。目前我正在使用这个:

    DataTable newdata = data.AsEnumerable().Where(x => x.Field<Int16>("Test") == 
                data.AsEnumerable().Where(y => y.Field<string>("Serial") == 
                    x.Field<string>("SerialNumber")).Select(y => 
                        y.Field<Int16>("Test")).Max()).Select(x => x).CopyToDataTable();

这确实可以完成这项任务,因为很明显它非常低效。是否有更有效的方法为每个序列号选择最上面的数据行?

谢谢

解决方案

接下来,根据Cam Bruce的回答,我使用Dictionary而不是连接实现了以下代码:

    //Get all of the serial numbers and there max test numbers
    Dictionary<string, Int16> dict = data.AsEnumerable().GroupBy(x => x.Field<string>("SerialNumber")).ToDictionary(x => x.Key, x => x.Max(y => y.Field<Int16>("Test")));

    //Create a datatable with only the max rows
    DataTable newdata = data.AsEnumerable().Where(x => x.Field<Int16>("Test") == 
                dict[x.Field<string>("SerialNumber")]).Select(x => x).CopyToDataTable();

    //Clear the dictionary
    dict.Clear();

1 个答案:

答案 0 :(得分:1)

这将为您提供每个序列号和Max测试。然后,您可以将该结果集加回DataTable以获取所有最大行。

var maxTest= data.AsEnumerable()
                  .GroupBy(g=> g.Field<string>("SerialNumber"))
                  .Select(d=> new
                  {
                     SerialNumber = g.Key
                     Test = g.Max(g.Field<Int16>("Field"))
                  };

var maxRows = from d in data.AsEnumerable()
              join m in maxTest
              on new { S = d.Field<string>("SerialNumber"), T = d.Field<Int16>("Test") } 
              equals new { S = m.SerialNumber, T = m.Test }
              select d;