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()
调用生成,让用户能够阐明意图。也许我们应该在生成的代码中生成注释来澄清这一点...
在您的具体情况下,我建议先比较 .Count
和 ImmutableList
,然后再使用 Enumerable.SequenceEquals()
。
假设您有一个 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()
调用生成,让用户能够阐明意图。也许我们应该在生成的代码中生成注释来澄清这一点...
在您的具体情况下,我建议先比较 .Count
和 ImmutableList
,然后再使用 Enumerable.SequenceEquals()
。