c# - LINQ 按总和值分组

标签 c# linq

假设我有这样一个类:

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/

相关文章:

c# - 如何计算程序运行时间

c# - VSTO MS Word 2003 加载项导致错误 "Word experienced a serious error the last time the add-in ' XYZ' 已打开”

c# - 具有离散错误代码的 .NET 异常处理

C# 使用 linq 反转和序列化字典

.net - 使用 Linq to XML 时出现 NullReferenceException

c# - 用于获取每个不同名称的 5 条最新记录的 LINQ

c# - 在 LINQ QUery : 中的 .Select 中使用索引时出错

c# - XNA 应用程序没有响应

c# - 当 BodyStyle = WebMessageBodyStyle.Wrapped 时从 C# 调用 Rest WCF 服务操作

c# - 如何在.NET中实现RS485 2线双向通信?