Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# 具有多个组作为层次结构的GroupBy_C#_Linq_Group By - Fatal编程技术网

C# 具有多个组作为层次结构的GroupBy

C# 具有多个组作为层次结构的GroupBy,c#,linq,group-by,C#,Linq,Group By,我正在使用GroupBy创建一组分层组,以便在多个子网格中使用 假设我有一个6列的查询,a、b、c、d、e、f 现在,我需要按a分组,然后按b分组,然后按c分组。并返回c组中的整行 var q = rows.GroupBy(x => x.a) 好的,很好。这给了我一组a。接下来,我们将它们按a和b分组 var q1 = q.Select(g =>new { Key = g.Key, SubGroup = g.GroupBy(x => x.b) } 好的,那也

我正在使用GroupBy创建一组分层组,以便在多个子网格中使用

假设我有一个6列的查询,a、b、c、d、e、f

现在,我需要按a分组,然后按b分组,然后按c分组。并返回c组中的整行

var q = rows.GroupBy(x => x.a)
好的,很好。这给了我一组a。接下来,我们将它们按a和b分组

var q1 = q.Select(g =>new {
    Key = g.Key,
    SubGroup = g.GroupBy(x => x.b)
}
好的,那也不错。我得到了我的a群和b的子群

现在我在第三层被难倒了。我尝试过各种语法,但大多数都不会编译。那些没有给出正确结果的

var q2 = q1.Select(g1 => new {
    Key = g1.Key,
    SubGroup = g1.GroupBy(x => x.c)
}
这不能编译。告诉我g1上没有GroupBy

var q2 = q.Select(g1 => new {
    Key = g1.Key,
    SubGroup = g1.GroupBy(x => x.c)
}
这并没有给出b子群,只有a和c

知道我做错了什么吗

编辑:

下面的内容也不起作用,说明g1.Key没有定义

var q2 = q.Select(g => new {
    Key = g.Key,
    SubGroup = g.Select(g1 => new {
            Key = g1.Key
            SubGroup = g1.GroupBy(a => a.c)
        })

我对这在内部做什么的理解很差。

现在,我并不是说这实际上是一个好方法;这可能会很慢,如果性能很重要,正确的方法可能是按照这些不同的标准对整个集合进行排序,然后查看已排序集合的不同部分

但是,如果您想使用
GroupBy
IGroupings
来管理它,那么您的做法是错误的。你想先从最深层次开始,然后开始工作

var groups = rows
    .GroupBy(x => new { x.A, x.B, x.C, x.D, x.E, x.F })
    .GroupBy(x => new { x.Key.A, x.Key.B, x.Key.C, x.Key.D, x.Key.E })
    .GroupBy(x => new { x.Key.A, x.Key.B, x.Key.C, x.Key.D, })
    .GroupBy(x => new { x.Key.A, x.Key.B, x.Key.C })
    .GroupBy(x => new { x.Key.A, x.Key.B })
    .GroupBy(x => x.Key.A);

groups.First().Key;             // will be an A value
groups.First().First().First(); // will be an A, B, C group

GroupBy实际上支持向GroupBy提供元素列表。每组将包含相同的前3项(A、B和C)。您可以使用.key方法获取密钥,并使用foreach处理不同的行。见示例:

    var groups = Elements.GroupBy(x => new {x.A, x.B, x.C});
    foreach (var group in groups)
    {
        Trace.WriteLine(group.Key + ": " + group.Count());
        foreach (var row in group)
        {
            Trace.WriteLine(row.D);
        }
    }
编辑:啊,好吧-那么你需要的是:

    var groups = Elements
        .GroupBy(a => new {a.A})
        .Select(g1 => new {
            A = g1.Key, 
            Groups = g1
            .GroupBy(b=> new {b.B})
            .Select(g2 => new {
                B = g2.Key,
                Groups = g2
                .GroupBy(c => new {c.C})
                .Select(g3 => new {
                    C = g3.Key,
                    Rows = g3
                })
            })
        });

    foreach (var groupA in groups)
    {
        Trace.WriteLine(groupA.A);
        foreach (var groupB in groupA.Groups)
        {
            Trace.WriteLine("\t" + groupB.B);
            foreach (var groupC in groupB.Groups)
            {
                Trace.WriteLine("\t\t" + groupC.C);
                foreach (var row in groupC.Rows)
                {
                    Trace.WriteLine("Row: " + row.ToString());
                }
            }
        }
    }

g只是一个实体列表,你说的是g.select,它给出了实体,但里面没有键是的,我明白了。我只是没有把这些点连在一起,弄清楚解决方案是什么。不,这就创建了一个组,a,b,c。不是每个组的集合。好的-我已经将其更改为为为您嵌套组-比其他答案更好,因为您不需要执行所有过度嵌套/多字段等操作,这实际上是我最初尝试的地方,现在我知道我做错了什么。然而,mquander的回答实际上更多的是我的本意,而不是我在做什么。原因是层次结构中的所有OJBECT都是IGroupings,而不是Groupings和IOrderedQueryables的混合,这就是您的解决方案所做的。但我会+1你这是非常接近我所寻找的,真的没有那么慢。我可能可以做到这一点,但如果我能让子组只包含一列,而不是多个,那就太好了。是的,看起来需要多个字段才能让较低的组工作。你这个男人!除非你是女人,否则你就是女人!另外,如果在进行分组之前将Linq-to-Sql查询转换为列表,则速度会明显加快,因为它是在内存中执行的,而不是在Sql server上执行多个查询。给Web服务器增加了一点负载,但我认为这是一个净胜利。