【发布时间】:2014-10-14 03:56:38
【问题描述】:
我有一个包含数千行的数据表。表格中有序列号栏和测试号栏。如果对一个序列进行了多次测试,则测试编号会增加。我需要能够从我的数据表中为每个序列选择最新的测试并将其插入另一个数据表。目前我正在使用这个:
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 的回答,我使用字典而不是连接实现了以下代码:
//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();
【问题讨论】:
-
你能写SQL来执行这个逻辑吗?这会比扫描整个
DataTable更有效率很多 -
从
sql获取值并显示在datatable是有效的方法 -
不幸的是,软件的性质决定了我无法有效地查询 SQL 数据库。
-
抱歉,不是软件的性质 - 数据库的性质。
标签: c# visual-studio datatable