LINQ / Multiple GroupBy。哪个是正确的,递归使用或链使用?

时间:2014-09-26 14:44:47

标签: c# linq

假设我有一个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)
        {

        }
    }
}

哪种方式合适?第一,第二或其他?

会有任何性能差异吗?

请记住,我想对此进行概括(更多级别)。

提前感谢您的建议。

1 个答案:

答案 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
            })
    });

实例化的匿名对象当然可以用适当的类替换。