这就是问题:
我有一长串带有属性的对象

1) int Book (B)
2) int Chapter (C)
3) int Paragraph (P)
4) int TimesRead (nx)


每本书都是其所有章节的总和,而每一章都是其所有段落的总和。显然,只有当您阅读了一本书的所有章节时,它才算是阅读了整本书。一章也是如此。必须阅读所有段落才能将本章算作已读。

看起来像这样的参考清单

B1 - C1 - P1 - 3x
B1 - C1 - P2 - 3x
B1 - C1 - P3 - 4x
B1 - C2 - P1 - 5x
B1 - C2 - P2 - 2x
B1 - C2 - P3 - 2x
B1 - C2 - P4 - 9x
B2 - C1 - P1 - 3x
...tens of thousands of them


B1C1仅算作3倍读取。 B1C2被视为2x读取,因为每个段落分别被读取3x和2x。我想算的只是最小的。
我希望所有章节的总和能使您完整地阅读它们的频率。但是我该如何总结每章中最低的TimesRead

B1C1 + B1C2 + B2C1
 3   +   2  +   3


使用linq或循环(我更喜欢linq)。

就我所知,这是不正确的。如何仅获取每对x.Book-x.Chapter中具有最低TimesRead的组?

SumTotalChaptersRead = listBookChapterParagraph
    .Where(x => x.TimesRead >= 1)
    .GroupBy(x => new Tuple<string, int>($"{x.Book}-{x.Chapter}", x.TimesRead))
    .ToList()
    .Where(x => x.TimesRead[.Min])
    .Sum(s => s.Key.Item2);


不知何故在其中某处必须有TimesRead.Min

最佳答案

这为我工作(在LINQPad中):

void Main()
{
    var data = new List<Info>
    {
        new Info(){ Book=1, Chapter=1, Paragraph=1, TimesRead=3},
        new Info(){ Book=1, Chapter=1, Paragraph=2, TimesRead=3},
        new Info(){ Book=1, Chapter=1, Paragraph=3, TimesRead=4},
        new Info(){ Book=1, Chapter=2, Paragraph=1, TimesRead=5},
        new Info(){ Book=1, Chapter=2, Paragraph=2, TimesRead=2},
        new Info(){ Book=1, Chapter=2, Paragraph=3, TimesRead=2},
        new Info(){ Book=1, Chapter=2, Paragraph=4, TimesRead=9},
        new Info(){ Book=2, Chapter=1, Paragraph=1, TimesRead=3},
    };

    var query = data.GroupBy(d => new {d.Book, d.Chapter})
    .Select(g => new
    {
        Book = g.Key.Book,
        Chapter = g.Key.Chapter,
        MinTimesRead = g.Min(d => d.TimesRead)
    });

    query.Dump();
}

public class Info
{
    public int Book { get; set; }
    public int Chapter { get; set; }
    public int Paragraph { get; set; }
    public int TimesRead { get; set; }
}


它产生以下输出:

c# - C#linq GroupBy和仅汇总每个组中的最低者-LMLPHP

它通过对BookChapter进行分组,并返回一个匿名对象,该对象包含该组的BookChapter和最小TimesRead

SumTimesRead只是该结果中.Sum(q => q.MinTimesRead)的简单问题。

LINQPad文件可用here



如果要访问分组中的项目,请将Select更改为:

.Select(g => new
{
    Book = g.Key.Book,
    Chapter = g.Key.Chapter,
    MinTimesRead = g.Min(d => d.TimesRead),
    Items = g.Select(i => i)
});


这会给你:

c# - C#linq GroupBy和仅汇总每个组中的最低者-LMLPHP
(图像可能与代码略有不同步,因为我在截屏后调整了代码,以使用更大的数据集提高内存效率)

关于c# - C#linq GroupBy和仅汇总每个组中的最低者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47274877/

10-11 01:51