c#linq GroupBy并总结每组中的最低点

时间:2017-11-13 22:51:04

标签: c# linq

这是问题所在: 我有一长串具有属性的对象

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

这是我得到的,但它不正确。如何只获得每对TimesRead最低的组x.Book-x.Chapter?

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

2 个答案:

答案 0 :(得分:2)

这对我有用(在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; }
}

它产生以下输出:

enter image description here

通过对BookChapter进行分组,并返回包含BookChapter和最小TimesRead的匿名对象来实现此目的基。

Sum的{​​{1}}只是TimesRead对该结果的一个简单问题。

LINQPad文件可用here

如果要访问分组中的项目,请将.Sum(q => q.MinTimesRead)更改为:

Select

哪个会给你:

enter image description here
(图像可能与代码稍微不同步,因为在我拍摄屏幕截图后,我调整了代码以使用更大的数据集来提高内存效率)

答案 1 :(得分:1)

现在不能检查出来,但是不会有类似的工作吗?

JSON