IEqualityComparer.Equals 与 IEnumerable.Contains 一起使用时,x 或 y 是列表中的值吗?

发布于 2024-07-17 06:46:43 字数 411 浏览 13 评论 0原文

IEnumberable 有一个扩展方法 Contains它需要两个参数。 第一个参数是要检查的值,第二个参数是 IEqualityComparer 的实现。 查看 IEqualityComparer.Equals,它需要两个名为 x 和 y 的参数,用于比较第一个和第二个对象。

我的问题是 X 或 Y 是 IEnumerable 中的值?

示例

List<string> test = new List<String() { "a", "b", "c" };
test.Contains("d", myComparer);

当它调用第一个值的 Equals 方法时,它将是 等于(“a”,“d”)还是等于(“d”,“a”)?

IEnumberable has an extension method Contains<T> which takes two parameters. The first parameter is the value to check for and the second is an implementation of IEqualityComparer.
Looking at IEqualityComparer.Equals it takes two parameters named x and y, for the first and second objects to compare.

My question is X or Y the value from the IEnumerable?

Example

List<string> test = new List<String() { "a", "b", "c" };
test.Contains("d", myComparer);

When it calls to the Equals method for the first value will it be
Equals("a","d") or Equals("d","a")?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浪菊怪哟 2024-07-24 06:46:43

这不重要——平等应该是对称的。 来自 IEqualityComparer.Equals< 的文档/a>:

Equals 方法是自反的,
对称、传递。 这就对了
如果用于比较则返回 true
对象本身; 对两个人来说是真的
如果 y 成立,则对象 x 和 y
和x; 对于两个对象 x 和 为真
z 如果 x 和 y 都成立,并且
对于 y 和 z 为真。

我不相信 Enumerable.Contains 中的用法是明确定义的,即它可能会在未来版本中发生变化。 如果您只是让相等比较器遵守接口文档,那就没问题了。

It shouldn't matter - equality should be symmetric. From the docs for IEqualityComparer<T>.Equals:

The Equals method is reflexive,
symmetric, and transitive. That is, it
returns true if used to compare an
object with itself; true for two
objects x and y if it is true for y
and x; and true for two objects x and
z if it is true for x and y and also
true for y and z.

I don't believe the usage in Enumerable.Contains is well-defined, i.e. it could change in a future version. If you just make your equality comparer obey the interface documentation, you'll be fine.

美胚控场 2024-07-24 06:46:43

为了完整起见,IEnumberable 的反射代码显示它位于左侧(见下文)。 然而,这并没有承诺永远不会改变,所以使用它是有风险的。

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer)
{
    if (comparer == null)
    {
        comparer = EqualityComparer<TSource>.Default;
    }
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    foreach (TSource local in source)
    {
        if (comparer.Equals(local, value))
        {
            return true;
        }
    }
    return false;
}

For the sake of completeness the reflected code of IEnumberable shows it is on the left hand side (see below). However that is not promised not to ever change, so there is risk in using it.

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer)
{
    if (comparer == null)
    {
        comparer = EqualityComparer<TSource>.Default;
    }
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    foreach (TSource local in source)
    {
        if (comparer.Equals(local, value))
        {
            return true;
        }
    }
    return false;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文