【发布时间】:2020-07-31 19:34:27
【问题描述】:
我相信下面的代码应该生成相同匿名类型的两个实例,具有相同顺序的属性,具有相同的名称、类型和值。
static void Main(string[] args)
{
var letterFreq1 = CountLetters("aabbbc");
var letterFreq2 = CountLetters("aabbbc");
if (letterFreq1.Equals(letterFreq2))
Console.WriteLine("Is anagram");
else
Console.WriteLine("Is not an anagram");
}
public static object CountLetters(string input) => input.ToCharArray()
.GroupBy(x => x)
.Select(x => new {Letter = x.Key, Count = x.Count()})
.OrderBy(x => x.Letter)
.ToList();
根据 MS 文档:
如果程序集中的两个或多个匿名对象初始值设定项指定了一系列具有相同顺序且具有相同名称和类型的属性,编译器会将这些对象视为相同类型的实例。它们共享相同的编译器生成的类型信息。
和
因为匿名类型的 Equals 和 GetHashCode 方法是根据属性的 Equals 和 GetHashCode 方法定义的,所以相同匿名类型的两个实例只有在它们的所有属性都相等时才相等。
我将此解释为我应该在 letterFreq1 和 letterFreq2 上获得相等,但这并没有发生。谁能确定平等检查失败的原因?我试图避免使用手动方法来比较属性值。
这是similar question,但无法帮助解决我的问题。
非常感谢。
【问题讨论】:
-
你是对的,匿名类型对象将比较相等,但这不是你在做什么。您在
List<T>上调用 .Equals,它不比较内容,而是进行引用比较,因此即使两个列表具有相同的内容,它们的比较也是不同的。 -
感谢 Lasse,非常感谢。我没发现那个。
-
查看我的答案以获得一些替代方案。
-
您引用的规范部分不适用于此处。它是关于两个或多个单独的表达式,但您只有一个表达式(执行多次)。
标签: c# equality anonymous-types