从大型DataTable中有效地提取行的子集?

时间:2011-08-18 18:10:23

标签: .net datatable performance

以下表为例:

+----+---------+-----------+
| ID | GroupID | OtherData |
+----+---------+-----------+
| 1  | 1       | w4ij6u    |
+----+---------+-----------+
| 2  | 2       | ai6465    |
+----+---------+-----------+
| 3  | 2       | ows64rg   |
+----+---------+-----------+
| 4  | 2       | wqoi46suj |
+----+---------+-----------+
| 5  | 3       | w9rthzv   |
+----+---------+-----------+
| 6  | 3       | 03ehsat   |
+----+---------+-----------+
| 7  | 4       | w469ia    |
+----+---------+-----------+
| 8  | 5       | nhwh57rt  |
+----+---------+-----------+
| 9  | 5       | mwitgjhx4 |
+----+---------+-----------+

如何有效地从此表中提取基于“GroupID”列的List<List<DataRow>>

基本上,我希望结果是:

MyList(0) = List: 1 DataRow, ID(s) 1
MyList(1) = List: 3 DataRows, ID(s) 2,3,4
MyList(2) = List: 2 DataRows, ID(s) 5,6
MyList(3) = List: 1 DataRow, ID(s) 7
MyList(4) = List: 2 DataRows, ID(s) 8,9

这是问题所在:此DataTable包含数百列和数万行,因此此操作必须尽可能高效。

我已经尝试过以下方法:

  • 使用行过滤器创建DataView,并从该视图中提取行/列表。
  • 获取GroupID的唯一列表后,循环内的Linq查询。 Linq查询根据Where子句选择GroupID的每个“集合”。

我希望其他人有更好,更有效的方法来提取这些数据。

2 个答案:

答案 0 :(得分:1)

您是否尝试过DataTable.Select()方法?以下是如何使用它的示例:

DataTable table = GetSomeData();
DataRow[] results = table.Select("SomeInt > 0");

List<DataRow> resultList = results.ToList();

使用DataTable.Select绝对应该比DefaultView.Filter更快,正如您所看到的那样,已经内置了将结果放入列表的能力。

答案 1 :(得分:0)

事实证明A)我的返回数据集太大(因为一个错误),而B)LINQ可能是最快的方法,而不需要编写一些非常长或黑客代码。感谢您的想法,每个人,但我现在坚持使用LINQ。