4

次のようなクラスがあるとします。

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 またはそれに近い値の束が必要です。これはリモートでも可能ですか、それともばかげた質問/アイデアですか? このコードを使用してworkToDo、4 つのセグメントに分割しています。

var query = workToDo.Select(x => x.Time)
        .Select((x, i) => new { Index = i, Value = x})
        .GroupBy(y => y.Index / 4)
        .ToList();

しかし、タイムズに基づいてそれを行う方法がわかりません。

4

3 に答える 3

2

これは、時間が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にします)。

于 2012-10-04T04:14:53.690 に答える
1

あなたが説明しているのは、パッキングの問題です (タスクが 7 時間のコンテナに詰め込まれている場合)。この問題の解決策として LINQ 構文を使用することは可能ですが、私が認識している LINQ 固有の解決策はありません。

于 2012-10-04T02:45:40.557 に答える