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

Can ReSharper generate equality members that correctly compare Collection members?

假设您有一个 class,其成员是集合,例如。

public class Forest {
    public IImmutableList<Tree> Trees { get; }
    . . .
}

当我使用 ReSharper 生成相等成员时,集合无法正确比较。生成的 Equals() 方法,在比较集合时,使用 Object 中定义的 public static bool Equals(object objA, object objB):

protected bool Equals(Forest other)
{
    return Equals(Trees, other.Trees);
}

不应该像Trees.SequenceEqual(other.Trees)一样使用Enumerable.SequenceEqual()吗?我是否需要手动更改生成的 Equals() 以使用 Enumerable.SequenceEqual(),或者是否有更好的方法不需要修改生成的代码?

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

总是生成 Enumerable.SequenceEquals() 在大多数情况下不是一个好主意,因为它在过于抽象的 IEnumerable<T> 接口上运行 - 它甚至不检查集合 .Count 到 returnfalse早。此外,在使用 IEnumerable<T> 接口枚举时,两个相等集合的一些类似集合的集合不保证元素的相同顺序。

一些不可变集合有特殊的 APIs 用于相等比较(奇怪的是,ImmtableList 没有这样的 API,不像 ImmutableHashSet.SetEquals),但是 ReSharper 没有特殊的此类 API 的知识。考虑到所有这些,我们决定坚持使用 object.Equals() 调用生成,让用户能够阐明意图。也许我们应该在生成的代码中生成注释来澄清这一点...

在您的具体情况下,我建议先比较 .CountImmutableList,然后再使用 Enumerable.SequenceEquals()