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