ReSharper能否生成可以正确比较Collection成员的相等成员?

时间:2019-02-02 17:24:08

标签: collections resharper equals

假设您有一个包含集合的成员的类,例如。

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(),还是有一些不需要修改生成代码的更好方法?

1 个答案:

答案 0 :(得分:1)

ReSharper不会尝试对集合执行深度相等集合检查,因为它不知道如何针对每种集合类型(以及“集合类型”到底意味着什么?)执行此操作。同样,大多数可变集合类型都是用复杂的对象(例如,内部存储元素相等比较器)表示的,而不是简单的“值”(不同于不变的集合),可以轻松地检查其相等性。

在大多数情况下,始终生成Enumerable.SequenceEquals()并不是一个好主意,因为它在过于抽象的IEnumerable<T>接口上进行操作-它甚至不检查集合.Count来返回{{1 }}。同样,当使用false接口枚举时,两个相等集合的某些类似集合的集合不能保证元素的顺序相同。

一些不可变集合具有用于相等性比较的特殊API(奇怪的是,IEnumerable<T>没有这样的API,与ImmtableList不同),但是ReSharper对此类API没有特殊的了解。考虑到所有这些,我们决定继续使用ImmutableHashSet.SetEquals调用生成,使用户能够澄清意图。也许我们应该在生成的代码中产生注释,以澄清这一点...

在您的情况下,我建议先比较object.Equals()中的.Count,然后再使用ImmutableList