【发布时间】:2011-02-23 10:39:43
【问题描述】:
我希望从 Dictionary<string, DateTime> 创建具有以下约束的批次:
- 批次中的所有项目都具有相同的日期
- 一个批次不能超过 X 个项目。如果有更多具有相同日期的项目,则必须创建另一个批次。
我已经制定了以下逻辑,但想知道是否有其他更简洁的方法可以仅使用 linq。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace dictionary_sort_by_value_test
{
class Program
{
static void Main(string[] args)
{
int maxBatchSize = 3;
Dictionary<string, DateTime> secs = new Dictionary<string, DateTime>();
secs.Add("6571 JT", new DateTime(2011, 1, 10));
secs.Add("6572 JT", new DateTime(2011, 1, 12));
secs.Add("6573 JT", new DateTime(2011, 1, 12));
secs.Add("6574 JT", new DateTime(2011, 1, 12));
secs.Add("6575 JT", new DateTime(2011, 1, 10));
secs.Add("6576 JT", new DateTime(2011, 1, 11));
secs.Add("6577 JT", new DateTime(2011, 1, 11));
secs.Add("6578 JT", new DateTime(2011, 1, 11));
secs.Add("6579 JT", new DateTime(2011, 1, 11));
var sorted = secs.OrderBy(o => o.Value).GroupBy(o => o.Value);
foreach (var date in sorted)
{
Console.Write("\nNew batch at {0} \n", date.Key);
int batchsize = 0;
foreach (var sec in date)
{
if (batchsize < maxBatchSize)
{
Console.Write(" {0} {1} \n", sec.Key, sec.Value);
batchsize++;
}
else
{
Console.Write("\nNew batch at {0} \n", date.Key);
Console.Write(" {0} {1} \n", sec.Key, sec.Value);
batchsize = 1;
}
}
}
}
}
}
【问题讨论】:
-
我也看不到您在哪里/如何在代码中创建新批次。您正在计算批次的数量,但不是每次都创建一个新批次并将其添加到您的“结果”中。就我个人而言,仅使用 LINQ 可以做到这一点的唯一方法是拥有另一个决胜局,这样你也可以按此分组。或者将您的逻辑实现为 IEnumerable
上的扩展方法。这样一来,它看起来像 LINQ,感觉像 LINQ,它将是 LINQ,因为无论如何 LINQ 都是这样实现的。
标签: linq datetime sorting group-by