我有一个基本如下所示的 DataTable
:
Id | parentId
__________________
1 | 100
2 | 100
3 | 200
4 | 300
5 | 300
6 | 300
7 | 400
8 | 400
如您所见,每一行都有一个唯一 ID,并通过父级 ID (Int64) 分配给父级。此外,每个父项可能包含多行。
在我的例子中, parent 是我们系统中的一张票,该行是该票的附件。
我想遍历 DataTable
以便我可以处理附件,但我需要根据 parentId
值分组处理。这是因为如果只有一个附件无法处理,那么整个组都会失败并且必须回滚,然后我将继续处理其他工单。
我可以使用类似于此(伪代码)的 if 语句来实现此目的:
var currentParent = 0;
foreach (var row in table.Rows)
{
if (row["parentId"] == currentParent)
{
// Same group
}
else
{
// New group
}
currentParent = row["parentId"];
}
这行得通,但我觉得它很乱,因为如果 100 个项目中的第一个项目失败,它仍然必须检查其余的 99 个项目。
我一直在尝试寻找一种解决方案,该解决方案使用 LINQ
和 IEnumerable
来获取每组行并可能将它们放入它们自己的临时 DataTable
。如果遇到错误,这将使迭代和跳过变得容易。不幸的是,我什至不确定我在寻找什么功能,所以我被困住了。
我认为 GroupBy
听起来不错并尝试了这个:
var results = table.AsEnumerable().GroupBy(row => row.Field<Int64>("parentId"));
不幸的是,这只返回 4 行,这是有道理的,因为在我的例子中只有 4 个不同的 parent 。
我正在寻找更像这样的东西:
var count = temporaryDataTable.Rows.Count();
// After first "grab" of a group 'count' is 2 for parentId 100
// temporaryDataTable contains Id values 1 & 2.
// After second "grab" 'count' is 1 for parentId 200
// temporaryDataTable contains Id value 3.
// After third "grab" 'count' is 3 for parentId 300
// temporaryDataTable contains Id values 4, 5 & 6.
// Last "grab" 'count' is 2 for parentId 400
// temporaryDataTable contains Id values 7 & 8.
或者,我在这里可能偏离主题,所以如果有比 LINQ
更适合以这种方式获取数据的方法,请告诉我。谢谢!
对结果
进行分组后,您可以使用此循环遍历您的组:
foreach (var group in results)
{
// This will get the parentId value in the group.
var parentId = group.Key;
// This will get all the Ids contained in the group.
foreach (var Id in group)
{
// Do something with Id. If something goees wrong
// and you want to proceed with the next group,
// just put a break; inside this foreach.
}
}
我是一名优秀的程序员,十分优秀!