这是问题所在: 我有一长串具有属性的对象
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
。
答案 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; }
}
它产生以下输出:
通过对Book
和Chapter
进行分组,并返回包含Book
,Chapter
和最小TimesRead
的匿名对象来实现此目的基。
Sum
的{{1}}只是TimesRead
对该结果的一个简单问题。
LINQPad文件可用here。
如果要访问分组中的项目,请将.Sum(q => q.MinTimesRead)
更改为:
Select
哪个会给你:
答案 1 :(得分:1)
现在不能检查出来,但是不会有类似的工作吗?
JSON