我正在使用以下两个功能来实现动态嵌套GroupBy:
public static IEnumerable<GroupResult<TElement>> GroupByMany<TElement>(this IEnumerable<TElement> elements, params string[] groupSelectors)
{
var selectors =
new List<Func<TElement, object>>(groupSelectors.Length);
foreach (var selector in groupSelectors)
{
LambdaExpression l = dyn.DynamicExpression.ParseLambda(typeof(TElement), typeof(object), selector);
selectors.Add((Func<TElement, object>)l.Compile());
}
return elements.GroupByMany(selectors.ToArray());
}
public static IEnumerable<GroupResult<TElement>> GroupByMany<TElement>(this IEnumerable<TElement> elements, params Func<TElement, object>[] groupSelectors)
{
if (elements.Count() > 0 && groupSelectors.Length > 0)
{
var selector = groupSelectors.First();
//reduce the list recursively until zero
var nextSelectors = groupSelectors.Skip(1).ToArray();
return
elements.GroupBy(selector).Select(
g => new GroupResult<TElement>
{
Key = g.Key ?? "(none)",
Count = g.Count(),
Items = g,
SubGroups = g.GroupByMany(nextSelectors)
});
}
else
return null;
}
这将生成GroupResult类型的嵌套结构:
public class GroupResult<T>
{
public object Key { get; set; }
public int Count { get; set; }
public IEnumerable<T> Items { get; set; }
public IEnumerable<GroupResult<T>> SubGroups { get; set; }
public override string ToString()
{ return string.Format("{0} ({1})", Key, Count); }
}
以这种方式分组的一些项目的示例如下:
世界
欧洲
法国
摄像头(包括高清遥控动作)
法国
摄像头(包括高清遥控动作)
西班牙
巡逻车
我要实现的目标如下:
世界
欧洲
法国
摄像头(包括高清遥控动作)
摄像头(包括高清遥控动作)
西班牙
巡逻车
粗体中有GroupResult类的Key属性。
有什么想法如何在最低层次上实现Key的加入?