简短回答:
- No,
Contains()
不重复使用IndexOf()
- 是的,比较起来它们是等效的
我反编译(ReSharper)并看到最终都使用了抽象EqualityComparer<T>.Default.Equals(T x, T y)
方法。这Default
实例为EqualityComparer<T>
根据类型 T 进行初始化(并缓存)。
列表.包含
EqualityComparer<T> @default = EqualityComparer<T>.Default;
// for loop
if (@default.Equals(this._items[index], item))
return true;
列表索引
return Array.IndexOf<T>(this._items, item, 0, this._size);
数组索引
public static int IndexOf<T>(T[] array, T value, int startIndex, int count)
{
// Some assertions
return EqualityComparer<T>.Default.IndexOf(array, value, startIndex, count);
}
相等比较器.IndexOf
internal virtual int IndexOf(T[] array, T value, int startIndex, int count)
{
// for loop
if (this.Equals(array[index], value))
return index;
}
这就是如何相等比较器.默认值被实例化
public static EqualityComparer<T> Default
{
get
{
EqualityComparer<T> equalityComparer = EqualityComparer<T>.defaultComparer;
if (equalityComparer == null)
{
equalityComparer = EqualityComparer<T>.CreateComparer();
EqualityComparer<T>.defaultComparer = equalityComparer;
}
return equalityComparer;
}
}
private static EqualityComparer<T> CreateComparer()
{
RuntimeType genericParameter1 = (RuntimeType) typeof (T);
if ((Type) genericParameter1 == typeof (byte))
return (EqualityComparer<T>) new ByteEqualityComparer();
// Some ifs go on
else
return (EqualityComparer<T>) new ObjectEqualityComparer<T>();
}