我希望我理解正确你。
给定一串日期,由今年星期分组:
// some testdata
var datesList = Enumerable.Range(0, 8).Select (e => DateTime.Now.AddDays(7 * e)).ToList();
Func<DateTime, int> weekProjector = d =>
CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(d, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
var weeks = datesList.GroupBy(weekProjector).ToList();
你应该得到你想要通过这个查询结果:
var result = weeks.OrderBy(w => w.Key)
.Select((g, i) => new {WeekType = (i/rotation) % 2, Week = g})
.GroupBy(w => w.WeekType)
.ToList();
其中rotation
是你的“旋转” (2
或4
)和2
是要(组A
和B
=> 2基团)基团的数目。
您可能要添加到Select
的GroupBy
后,只选择你想要的数据,例如:
var weekA = result.Where(r => r.Key==0).Select(g => g).SelectMany(g => g).SelectMany(a => a.Week).ToList();
var weekB = result.Where(r => r.Key==1).Select(g => g).SelectMany(g => g).SelectMany(a => a.Week).ToList();
更可读/通用的解决方案:
void Rotate<TResult, TGroup>(IEnumerable<TResult> datesList, Func<TResult, TGroup> grouper, int rotation, out List<TResult> listA, out List<TResult> listB)
{
listA = new List<TResult>();
listB = new List<TResult>();
var weeks = datesList.GroupBy(grouper).ToList();
var c_rotation = 0;
var c_list = listA;
using (var en = weeks.GetEnumerator())
while(en.MoveNext())
{
c_list.AddRange((IGrouping<TGroup, TResult>)en.Current);
c_rotation++;
if (c_rotation == rotation)
{
c_rotation = 0;
c_list = c_list == listA ? listB : listA;
}
}
}
使用它喜欢:
List<DateTime> listA;
List<DateTime> listB;
Func<DateTime, int> weekProjector = d =>
CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(d, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
Rotate(datesList, weekProjector, 2, out listA, out listB);
我很难理解你的问题。你能否给出一个更完整的例子,说明你希望达到的目标,显示星期的最初状态和最终状态? – 2013-02-18 12:54:56
什么是A周和B周? – 2013-02-18 12:55:16
@Tim当周收集有4周的分组,周旋转值为2时,前2周为A周,最后2周为B周。我认为这从我上面的示例中可以清楚看出。我希望现在清楚:) – Elisabeth 2013-02-18 12:58:07