代码之家  ›  专栏  ›  技术社区  ›  user875234

GroupBy KeySelector函数是什么样子的?

  •  0
  • user875234  · 技术社区  · 7 年前

    GroupBy 以自己的方式。键选择程序代码不正确。一个主要问题是 Widget.foo

    小工具.cs

    public class Widget
    {
        public string foo { get; set; }
        public double bar { get; set; }
        public bool fee { get; set; }
    }
    

    static void Main(string[] args)
    {
        var widgets = new List<Widget>()
        {
            new Widget() { foo = "red"  , bar = 1.0, fee = true },
            new Widget() { foo = "green", bar = 2.0, fee = true },
            new Widget() { foo = "green", bar = 2.0, fee = false },
            new Widget() { foo = "green", bar = 3.0, fee = false },
            new Widget() { foo = "blue" , bar = 4.0, fee = true }
        };
    
        var gb = widgets.GroupBy(
            w => GenerateGroupByKey(),
            w => w,
            (prop, groupedWidgets) => new
            {
                GroupedWidgets = groupedWidgets
            }
        ).ToList();
    }
    

    按键选择器

    static Func<Widget, object> GenerateGroupByKey() 
    {
        Func<Widget, object> s = delegate(Widget widget)
        {
            return new { widget.foo };
        };
    
        return s;
    }
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   Django    7 年前

    必须将委托传递给参数,所以只需调用函数并返回委托。

    var gb = widgets.GroupBy(
        GenerateGroupByKey(),
        w => w,
        (prop, groupedWidgets) => new
        {
            GroupedWidgets = groupedWidgets
        }
    ).ToList();
    
        2
  •  0
  •   Alexander I.    7 年前

    您的分组不起作用,因为 GenerateGroupByKey()

    Equals here .

    new { widget.foo } ?

    您可以只返回字符串而不是对象。

    试着像这样使用委派:

    static Func<Widget, object> GenerateGroupByKey() 
    {
        Func<Widget, object> s = delegate(Widget widget)
        {
            return widget.foo;
        };
    
        return s;
    }
    
        3
  •  0
  •   ManishM    7 年前

    使用如下参数分组

    Func<TSource, TKey> keySelector,
    Func<TSource, TElement> elementSelector,
    Func<TKey, IEnumerable<TElement>, TResult> resultSelector
    

    编写时w=>GenerateGroupByKey() 您正在创建一个输入参数为GenerateGroupByKey()的新FUNC

    static Func<Widget, object> GenerateGroupByKey() 
    {
        Func<Widget, object> s = delegate(Widget widget)
        {
            return new { widget.foo };
        };
    
        return s;
    }
    

    你不能调用这个函数

    解决方案:

    static void Main(string[] args)
    {
        var widgets = new List<Widget>()
        {
            new Widget() { foo = "red"  , bar = 1.0, fee = true },
            new Widget() { foo = "green", bar = 2.0, fee = true },
            new Widget() { foo = "green", bar = 2.0, fee = false },
            new Widget() { foo = "green", bar = 3.0, fee = false },
            new Widget() { foo = "blue" , bar = 4.0, fee = true }
        };
    
        var gb = widgets.GroupBy(
            GenerateGroupByKey(), // Your FUNC method
            w => w,
            (prop, groupedWidgets) => new
            {
                GroupedWidgets = groupedWidgets
            }
        ).ToList();
    }