假设您有一个包含集合的成员的类,例如。
public class Forest {
public IImmutableList<Tree> Trees { get; }
. . .
}
当我使用ReSharper生成相等成员时,集合无法正确比较。比较集合时,生成的Equals()方法使用在public static bool Equals(object objA, object objB)
中定义的Object
:
protected bool Equals(Forest other)
{
return Equals(Trees, other.Trees);
}
不是像Enumerable.SequenceEqual()
那样使用Trees.SequenceEqual(other.Trees)
吗?我是否需要手动更改生成的Equals()以使用Enumerable.SequenceEqual()
,还是有一些不需要修改生成代码的更好方法?
答案 0 :(得分:1)
ReSharper不会尝试对集合执行深度相等集合检查,因为它不知道如何针对每种集合类型(以及“集合类型”到底意味着什么?)执行此操作。同样,大多数可变集合类型都是用复杂的对象(例如,内部存储元素相等比较器)表示的,而不是简单的“值”(不同于不变的集合),可以轻松地检查其相等性。
在大多数情况下,始终生成Enumerable.SequenceEquals()
并不是一个好主意,因为它在过于抽象的IEnumerable<T>
接口上进行操作-它甚至不检查集合.Count
来返回{{1 }}。同样,当使用false
接口枚举时,两个相等集合的某些类似集合的集合不能保证元素的顺序相同。
一些不可变集合具有用于相等性比较的特殊API(奇怪的是,IEnumerable<T>
没有这样的API,与ImmtableList
不同),但是ReSharper对此类API没有特殊的了解。考虑到所有这些,我们决定继续使用ImmutableHashSet.SetEquals
调用生成,使用户能够澄清意图。也许我们应该在生成的代码中产生注释,以澄清这一点...
在您的情况下,我建议先比较object.Equals()
中的.Count
,然后再使用ImmutableList
。