我正在尝试使用显式键类型对某些对象执行 Linq GroupBy。我没有将一个传递IEqualityComparer
给 GroupBy,所以根据文档:
默认相等比较器
Default
用于比较键。
它解释了EqualityComparer<T>.Default
这样的属性:
该
Default
属性检查 type 是否T
实现了System.IEquatable<T>
泛型接口,如果是,则返回EqualityComparer<T>
使用该实现的一个。
在下面的代码中,我将一组Fred
对象分组。它们有一个名为 的键类型FredKey
,它实现了IEquatable<FredKey>
.
这应该足以使分组工作,但分组不起作用。在下面的最后一行中,我应该有 2 个组,但我没有,我只有 3 个包含 3 个输入项的组。
为什么分组不起作用?
class Fred
{
public string A;
public string B;
public FredKey Key
{
get { return new FredKey() { A = this.A }; }
}
}
class FredKey : IEquatable<FredKey>
{
public string A;
public bool Equals(FredKey other)
{
return A == other.A;
}
}
class Program
{
static void Main(string[] args)
{
var f = new Fred[]
{
new Fred {A = "hello", B = "frog"},
new Fred {A = "jim", B = "jog"},
new Fred {A = "hello", B = "bog"},
};
var groups = f.GroupBy(x => x.Key);
Debug.Assert(groups.Count() == 2); // <--- fails
}
}