Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ/多组比。递归用法和链式用法,哪一种是正确的?_C#_Linq - Fatal编程技术网

C# LINQ/多组比。递归用法和链式用法,哪一种是正确的?

C# LINQ/多组比。递归用法和链式用法,哪一种是正确的?,c#,linq,C#,Linq,假设我有一个DataTable,我想对它进行3级分组(将来甚至更多)。为了简单起见,我将要求两个级别 DataTable dt = getTable(); 使用LINQ,我可以想出两种方法。首先, var chainWay = dt.Rows.Cast<DataRow>().GroupBy(dr => new { A = dr["A"], B = dr["B"] }) .GroupBy(g =>

假设我有一个
DataTable
,我想对它进行3级分组(将来甚至更多)。为了简单起见,我将要求两个级别

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 chainWay=dt.Rows.Cast()
.GroupBy(g=>new{g.Key.A});
foreach(链道中的var组)
{
foreach(组中的变量组2)
{
foreach(组2中的数据行dr)
{
}
}
}
第二,

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)
        {

        }
    }
}
var recursiveWay=dt.Rows.Cast().GroupBy(dr=>dr[“A”])
.Select(g=>new{g.Key,g=g.GroupBy(dr=>dr[“B]”)});
foreach(递归方式中的var组)
{
foreach(group.G中的var group2)
{
foreach(组2中的数据行dr)
{
}
}
}
哪条路合适?第一,第二或任何其他

性能会有什么不同吗

请记住,我想对此做一个概括(更多级别)


提前感谢您的建议。

这似乎接近于“主要基于意见”。这里有第三个选项,我已经使用了很多次。它更详细,但我认为它使结构更清晰。很容易看出嵌套的重复性,因此很容易推广到更多的分组

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

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

我会选择第一个选项,因为它更具可读性,至于这个
会有任何性能差异吗?
-对其进行基准测试并找出答案。这些甚至不会产生相同的结果,所以,当它们实际上做的事情不同时,比较它们的性能是毫无意义的。@Servy你是对的。它们的类型不同,但非常相似。只需一个很小的差异,我就可以迭代并执行相同的操作(只是编辑了问题)。如果我能决定选择哪一种,那么就很容易调整循环。@Servy我想他意识到数据结构不是二进制兼容的,但结果结构在语义上是相同的。一种递归的方法。感谢您提醒我,
GroupBy
还有其他重载。