gpt4 book ai didi

c# linq GroupBy 和仅总结每组中的最低值

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:03 25 4
gpt4 key购买 nike

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

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 算作 2 次阅读,因为每个段落分别被阅读了 3 次和 2 次。我要数的只是最小值。我想要所有章节的总和,它们被完整阅读的频率。但是,我如何才能只对每一章的最低 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; }
}

它产生以下输出:

enter image description here

它通过在 Book 上分组来做到这一点和 Chapter ,并返回一个包含 Book 的匿名对象, Chapter , 和最小 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)
});

这会给你:

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com