对DataTable列计算进行最有效的计算排序

时间:2010-06-01 20:39:11

标签: c# .net algorithm ado.net

假设您有一个DataTable,其中包含“id”,“cost”,“qty”列:

DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("cost", typeof(double));
dt.Columns.Add("qty", typeof(int));

它的关键是“id”:

dt.PrimaryKey = new DataColumn[1] { dt.Columns["id"] };

现在我们感兴趣的是每个数量的成本。所以,换句话说,如果你有一行:

id | cost  | qty
----------------
42 | 10.00 | 2

每个数量的费用 5.00

我的问题是,在前面的表中,假设它构造了数千行,并且您对每个数量前3行成本感兴趣。所需信息为 ID 每个数量的费用。你不能使用LINQ。

在SQL中它将是微不足道的;如何 BEST (最有效率)你会在没有LINQ的情况下用C#完成它吗?

更新: 寻求不修改表格的答案。

3 个答案:

答案 0 :(得分:1)

我不确定这是否是最好的,但是它胜过排序然后挑选具有时间复杂度O(n log n)的前三个元素。

您可以使用优先级队列来过滤前三个元素。有关.Net优先级队列实现的信息可用here

基本思想是将数据表的前三个元素插入优先级队列。然后,您连续添加所有剩余元素,在每次添加后删除顶部元素。之后保留在优先级队列(堆)中的元素将是前三个元素。

在添加另一列(您只需要定义相对排序/优先级标准)方面不需要对表进行修改,也不会更改表元素的顺序。时间复杂度为O(n log 3)= O(n)。

答案 1 :(得分:1)

添加一列:

dt.Columns["CostPerQty"].Expression = "cost / qty";

然后排序:

dt.DefaultView.Sort = "CostPerQty desc";

刚刚获得前3行。

答案 2 :(得分:0)

我喜欢BFree的解决方案,但是,如果出于某种原因不希望数据集中有额外的列,是否有理由无法启动对数据库的调用并为结果执行存储过程? / p>

或者,不要使用DataTable,而是从ADO.NET结果中解析对象并创建这些对象的IEnumerable<T>(或List,或数组等)。然后对它们进行排序?我更喜欢对象解决方案(即使没有使用Entities,或者Linq2SQL等),因为它让我在使用它后可以对行做更多的灵活性......