C#GroupBy - 创建多个分组级别

Sam*_*Sam 6 c# linq group-by

鉴于以下课程:

public class Transaction
{
    public string Category { get; set; }
    public string Form { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何获得按CategoryForm?分组的事务分组?

基本上我希望它输出如下:

Category 1
    Form 1
        Transaction1
        Transaction2
        Transaction3
        ...
    Form 2
        Transaction1
        Transaction2
        Transaction3
        ...
Category 2
    Form 1
        Transaction1
        Transaction2
        Transaction3
        ...
    Form 2
        Transaction1
        Transaction2
        Transaction3
        ...
Run Code Online (Sandbox Code Playgroud)

Bra*_*AGr 8

这是一个使用嵌套的foreach循环的例子,我不知道你如何在单个linq语句中执行此操作,可能有很多selectmanys?

var transactions = new[]{
    new{Category = "1", Form = "1", Title = "Trans1" },
    new{Category = "1", Form = "1", Title = "Trans2" },
    new{Category = "1", Form = "1", Title = "Trans3" },
    new{Category = "1", Form = "2", Title = "Trans1" },
    new{Category = "1", Form = "2", Title = "Trans2" },
    new{Category = "1", Form = "2", Title = "Trans3" },
    new{Category = "2", Form = "1", Title = "Trans1" },
    new{Category = "2", Form = "1", Title = "Trans2" },
    new{Category = "2", Form = "1", Title = "Trans3" },
    new{Category = "1", Form = "3", Title = "Trans1" },
    new{Category = "1", Form = "3", Title = "Trans2" },
    new{Category = "1", Form = "3", Title = "Trans3" },
};

foreach(var byCategory in transactions.GroupBy(x => x.Category))
{
    Console.WriteLine(byCategory.Key);
    foreach(var byForm in byCategory.GroupBy(x => x.Form))
    {
        Console.WriteLine("\t" + byForm.Key);
        foreach(var trans in byForm)
        {
            Console.WriteLine("\t\t" + trans.Title);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只是因为我很好奇我想出了以下内容,你不应该在生产代码中使用它,因为它很荒谬(如果你有这样的数据结构它应该分解成类似的东西Dictionary<CategoryName, FormGroup>或者某些东西意义的类型)

Dictionary<string, Dictionary<string, List<string>>> tooManyDictionaries = transactions
        .GroupBy(x => x.Category)
        .ToDictionary(
            catGroup => catGroup.Key,
            catGroup => catGroup
                .GroupBy(x => x.Form)
                .ToDictionary(
                    formGroup => formGroup.Key,
                    formGroup => formGroup.Select(x => x.Title).ToList()));
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 7

我最终得到了以下内容,因为在迭代集合之前需要完成分组.

种子一些交易

var cats = new[] { "Category 1", "Category 2", "Category 3" };
var frms = new[] { "Form 1", "Form 2", "Form 3" };
var transactions = new List<Transaction>();

for (var i = 0; i <= 150; i++)
{
    transactions.Add(new Transaction
    {
        Category = i % 2 == 0 ? cats[0] : i % 3 == 0 ? cats[1] : cats[2],
        Form = i % 5 == 0 ? frms[0] : i % 7 == 0 ? frms[1] : frms[2]
    });
}
Run Code Online (Sandbox Code Playgroud)

分组

var groupedTransactions = transactions.GroupBy(x => x.Category)
    .Select(x => new
    {
        Category = x.Key,
        Forms = x.ToList()
            .GroupBy(y => y.Form)
    });
Run Code Online (Sandbox Code Playgroud)

将其写入控制台

foreach (var group in groupedTransactions.OrderBy(x => x.Category))
{
    Console.WriteLine(group.Category);
    foreach (var form in group.Forms.OrderBy(x => x.Key))
    {
        Console.WriteLine("\t" + form.Key);
        foreach (var transaction in form)
        {
            Console.WriteLine("\t\t" + transaction.Id);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)