GroupBy KeySelector函数是什么样的?

时间:2018-09-05 19:56:35

标签: c# linq

我想将GroupBy的KeySelector函数分解成自己的方法。 KeySelector代码不正确。一个主要问题是Widget.foo与“绿色”不匹配,但我认为应该匹配。

Widget.cs

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

Program.cs

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();
}

KeySelector

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

    return s;
}

3 个答案:

答案 0 :(得分:2)

您必须将委托传递给参数,因此只需调用函数并返回委托即可。

var gb = widgets.GroupBy(
    GenerateGroupByKey(),
    w => w,
    (prop, groupedWidgets) => new
    {
        GroupedWidgets = groupedWidgets
    }
).ToList();

答案 1 :(得分:0)

您的分组不起作用,因为在[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (2, 0)]方法中您创建了新对象。

如果对象具有相等的内存引用,则它们等于。您可以查看有关order=2 here的更多详细信息。

要创建诸如GenerateGroupByKey()之类的新对象吗?

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

尝试像这样使用委托:

Equals

答案 2 :(得分:0)

使用以下参数进行分组

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

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

但是GenerateGroupByKey()本身是一个FUNC

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

    return s;
}

您并没有调用该FUNC

解决方案: 不要创建另一个FUNC。直接传递GenerateGroupByKey():)

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();
}