假设我有这样一个类:
public class Work
{
public string Name;
public double Time;
public Work(string name, double time)
{
Name = name;
Time = time;
}
}
我有一个 List<Work>
大约有 20 个值已全部填充:
List<Work> workToDo = new List<Work>();
// Populate workToDo
有什么方法可以将 workToDo
分组?分成段,其中每个段的时间总和是一个特定的值?说 workToDo
具有如下值:
Name | Time
A | 3.50
B | 2.75
C | 4.25
D | 2.50
E | 5.25
F | 3.75
如果我希望次数之和为7,每段还是List<Work>
应该有一堆值,其中所有时间的总和为 7 或接近 7。这甚至是遥不可及的,还是只是一个愚蠢的问题/想法?我正在使用此代码来分隔 workToDo
分为 4 段:
var query = workToDo.Select(x => x.Time)
.Select((x, i) => new { Index = i, Value = x})
.GroupBy(y => y.Index / 4)
.ToList();
但我不确定如何根据 Times 去做。
最佳答案
这是一个查询,它将您的数据分组,时间接近 7,但未超过:
Func<List<Work>,int,int,double> sumOfRange = (list, start, end) => list
.Skip(start)
.TakeWhile ((x, index) => index <= end)
.ToList()
.Sum (l => l.Time);
double segmentSize = 7;
var result = Enumerable.Range(0, workToDo.Count ())
.Select (index => workToDo
.Skip(index)
.TakeWhile ((x,i) => sumOfRange(workToDo, index, i)
<= segmentSize));
示例数据集的输出是:
A 3.5
B 2.75
total: 6.25
B 2.75
C 4.25
total: 7
C 4.25
D 2.5
total: 6.75
D 2.5
total: 2.5
E 5.25
total: 5.25
F 3.75
total: 3.75
如果您希望一个段的总数超过 7 个,那么您可以将 segmentSize
变量增加 25% 左右(即 8.75)。
关于c# - LINQ 按总和值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12719425/