我已经把通用的LINQ到对象扩展方法插入缺失的东西放进顺序:
public static IEnumerable<T> InsertMissing<T, U>(this IEnumerable<T> source,
Func<T, U> key, Func<U, U> increment, Func<U, T> create)
{
bool first = true;
U last = default(U);
foreach (var ig in source)
{
U current = key(ig);
if (first)
{
first = false;
last = current;
yield return ig;
continue;
}
while (!(last = increment(last)).Equals(current))
{
yield return create(last);
}
yield return ig;
}
}
你还需要的IGrouping
自定义实现:
class EmptyGrouping<K, E> : IGrouping<K, E> {
public K Key { get; set; }
public IEnumerator<E> GetEnumerator() {
return Enumerable.Empty<E>().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return this.GetEnumerator();
}
}
然后,你将需要orderby
后结束你的查询,使用该调用遵循它,然后把你的select
算账:
var allGroups = query.InsertMissing(
// Key selector
g => g.Key,
// Get next desired key from current key
d => d.AddDays(-1),
// Create item for missing key
d => new EmptyGrouping<DateTime,YourAdjustmentType>{ Key = d });
这将就会失控,如果你的钥匙是没有顺序的,或者其中一个不在正确的位置(例如,在你的情况下,不是在午夜)。
这样做的好处是不需要对原始源进行多个查询来确定最小/最大值以生成密钥列表,然后再进一步查询以加入并获取数据。
好!喜欢查询扩展。 –