这就是问题:
我有一长串带有属性的对象
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; }
}
它产生以下输出:
它通过对
Book
和Chapter
进行分组,并返回一个匿名对象,该对象包含该组的Book
,Chapter
和最小TimesRead
。Sum
的TimesRead
只是该结果中.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和仅汇总每个组中的最低者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47274877/