首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Array.IndexOf不像IEquatable那样检查IEquatable?

为什么Array.IndexOf不像IEquatable那样检查IEquatable?
EN

Stack Overflow用户
提问于 2017-07-09 02:21:38
回答 3查看 779关注 0票数 8

考虑一下代码:

代码语言:javascript
复制
public static void Main()
{
    var item = new Item { Id = 1 };

    IList list = new List<Item> { item };
    IList array = new[] { item };

    var newItem = new Item { Id = 1 };

    var lIndex = list.IndexOf(newItem);
    var aIndex = array.IndexOf(newItem);

    Console.WriteLine(lIndex);
    Console.WriteLine(aIndex);
}

public class Item : IEquatable<Item>
{
    public int Id { get; set; }

    public bool Equals(Item other) => other != null && other.Id == Id;

}

结果:

代码语言:javascript
复制
0
-1

为什么List<T>Array的结果不同?我想这是故意的,但为什么呢?

查看List.IndexOf的代码让我更加好奇,因为它正在移植到Array.IndexOf

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-09 02:38:34

数组类调用方法中IndexOf的实现:

public static int IndexOf(Array array, object value, int startIndex, int count)

正如您所看到的,它使用object作为值参数。在这个方法中有代码:

代码语言:javascript
复制
object obj = objArray[index];
if (obj != null && obj.Equals(value))
    return index;

类与对象一起工作,因此它调用public virtual bool Equals(object obj)方法,而不是泛型方法。

List类中,IndexOf使用泛型实现:

代码语言:javascript
复制
public static int IndexOf<T>(T[] array, T value, int startIndex, int count)

因此,它使用了通用质量比较器:

代码语言:javascript
复制
EqualityComparer<T>.Default.IndexOf(array, value, startIndex, count);

UPD:我写了一篇关于这个问题的小文章:http://blog.rogatnev.net/2017/07/14/IndexOf-with-IEquatable.html

票数 5
EN

Stack Overflow用户

发布于 2017-07-09 02:33:41

因为泛型对象集合在测试ContainsIndexOfLastIndexOfRemove等方法中是否相等时使用了IndexOf接口。

数组对<T>一无所知,所以它不能实现或使用IEquatable接口。

数组只保存非泛型的对象。它将调用Equals将一个对象与另一个对象进行比较,因为所有对象都有一个可以随意重写的Equals方法。

票数 4
EN

Stack Overflow用户

发布于 2017-07-09 02:35:22

List<T>可以使用IEquatable<T>接口,这样就可以像预期的那样工作。

数组使用的是来自EqualsObject方法,而不是覆盖该方法,而只是实现IEquatable

尝试定义Equals如下:

代码语言:javascript
复制
public override bool Equals(Object other) => other != null && (other as Item).Id == Id;

这对两种情况都有同样的效果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44992402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档