假设我有一个DataTable
,我想进行3级分组(或将来会更多)。只是为了简化,我会要求2个级别。
DataTable dt = getTable();
使用LINQ,我可以想到两种方法。首先,
var chainWay = dt.Rows.Cast<DataRow>().GroupBy(dr => new { A = dr["A"], B = dr["B"] })
.GroupBy(g => new { g.Key.A });
foreach (var group in chainWay)
{
foreach (var group2 in group)
{
foreach (DataRow dr in group2)
{
}
}
}
和第二个,
var recursiveWay = dt.Rows.Cast<DataRow>().GroupBy(dr => dr["A"])
.Select(g => new { g.Key, G = g.GroupBy(dr => dr["B"]) });
foreach (var group in recursiveWay)
{
foreach (var group2 in group.G)
{
foreach (DataRow dr in group2)
{
}
}
}
哪种方式合适?第一,第二或其他?
会有任何性能差异吗?
请记住,我想对此进行概括(更多级别)。
提前感谢您的建议。
答案 0 :(得分:0)
这似乎接近于“主要基于意见”。这是我多次使用过的第三个选项。它更冗长,但我认为它使结构更清晰。它也很容易看到嵌套的重复性,所以很容易推广到更多的分组。
var query = source.GroupBy(
x => x.A,
(a, aGroup) => new
{
A = a,
Items = aGroup.GroupBy(
x => x.B,
(b, bGroup) => new
{
B = b,
Items = bGroup
})
});
实例化的匿名对象当然可以用适当的类替换。