【问题标题】:Most efficient sorting of calculation on DataTable column calculation对 DataTable 列计算的最有效排序
【发布时间】:2011-02-26 13:04:18
【问题描述】:

假设您有一个包含“id”、“cost”、“qty”列的 DataTable:

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 中这将是微不足道的;在没有 LINQ 的情况下,您将如何在 C# 中实现 BEST(最有效)?

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

【问题讨论】:

    标签: c# .net algorithm ado.net


    【解决方案1】:

    我不确定这是否是最好的,但它优于排序然后选择时间复杂度为 O(n log n) 的前三个元素。

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

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

    就添加另一列而言,无需修改表格(您只需要定义相对排序/优先级标准)并且不会更改表格元素的顺序。时间复杂度为 O(n log 3) = O(n)。

    【讨论】:

    • 这是个好主意,非常符合我的问题。
    【解决方案2】:

    添加一列:

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

    然后排序:

    dt.DefaultView.Sort = "CostPerQty desc";
    

    只获取前 3 行。

    【讨论】:

    • 这可行,但出于好奇,我正在寻找一种不会改变表格的替代方案。支持您并编辑问题。
    【解决方案3】:

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

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

    【讨论】:

    • 毫无疑问,但问题在于 DataTable,而且仅限于此。如果这可以在任何数据结构中完成,它将破坏问题背后的目的。 (这就是我在底部发布 no LINQ 的原因,但我的意思是更笼统。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2013-02-15
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多