我想将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;
}
答案 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();
}