如何使用LINQ Multiple GroupBy

时间:2018-12-10 13:47:43

标签: c# linq dynamic grouping

我正在使用以下两个功能来实现动态嵌套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的加入?

0 个答案:

没有答案