【发布时间】:2015-05-04 19:37:54
【问题描述】:
因此,在 Linq 中的 GroupBy() 之类的东西中,您可以提供 IEqualityComparer<T> 的实现来帮助进行对象比较。不过,似乎简单地传入一个 lambda 表达式会更容易。
例子:
// current implementation
myCollection.GroupBy(c => c.Foo, c => c.Bar, new FooBarComparer());
// it seems easier to...
myCollection.GroupBy(c => c.Foo, c => c.Bar, (x, y) => x.Baz == y.Baz);
给定IEqualityComparer<T> 的简单实现,如下所示:
public class FooBarComparer : IEqualityComparer<FooBar> {
public bool Equals(FooBar x, FooBar y) {
return x.Baz == y.Baz;
}
public int GetHashCode(FooBar obj) {
return obj.GetHashCode();
}
}
似乎提供 lambda 表达式可能同样有效。就目前而言,如果我尝试将带有 Linq 查询的 IEqualityComparer<T> 传递给数据库,它会失败,因为 SQL Server(或其他)对我的类一无所知。似乎可以将 lambda 转换为可在目标数据库中使用的 SQL。
是否有特定原因在 Linq 中未将其作为选项提供?
【问题讨论】:
-
一个 lambda 表达式不支持 GetHashCode,它在内部用于提高性能。
-
您必须有第二个 lambda 来生成哈希码,但由于确定相等性和哈希码应该相关,因此将它们封装在同一个类中更有意义。
-
GetHashCode()优先于Equals()使用?我在想 lambda 的重载会使用该 lambda 进行比较,就好像它是Equals()。 -
如果你愿意,可以直接按
c.Foo.Baz分组, -
我投票结束这个问题,因为它需要阅读该功能开发人员的想法。