Поскольку связанный список не является словарем, я бы ожидал , что он будет использовать EqualityComparer<T>.Default.Equals(x,y)
.
Это поддерживает (по порядку):
IEquatable<T>
(для рассматриваемого T
)
object.Equals
(по умолчанию используется равенство ссылок или поддерживается переопределенный Equals(object)
)
Обратите внимание, что EqualityComparer<T>
также обрабатывает обычные правила null
и т. Д. Для обоих классов и Nullable<T>
.
(обновление: проверено и исправлено; с Find(T)
)
...
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
...
if (comparer.Equals(head.item, value)) {...}
...
Обновление, чтобы доказать, что это работает, когда ISomeInterface: IEquatable<ISomeInterface>
, согласно комментариям:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
LinkedList<IFoo> foos = new LinkedList<IFoo>();
foos.AddLast(new Foo1("abc"));
foos.AddLast(new Foo2("def"));
Console.WriteLine("checking contains...");
bool c = foos.Contains(new Foo1("ghi"));
Console.WriteLine("...done");
}
}
interface IFoo : IEquatable<IFoo>
{
void Bar();
}
class Foo1 : IFoo
{
public string Value { get; set; }
public Foo1(string value) { Value = value; }
public override bool Equals(object other)
{
Console.WriteLine(Value + " > override Equals");
return base.Equals(other);
}
bool IEquatable<IFoo>.Equals(IFoo other)
{
Console.WriteLine(Value + " > explicit Equals");
return base.Equals(other);
}
public void Bar() { }
public override int GetHashCode() { return base.GetHashCode(); }
}
class Foo2 : IFoo
{
public string Value { get; set; }
public Foo2(string value) { Value = value; }
public override bool Equals(object other)
{
Console.WriteLine(Value + " > override Equals");
return base.Equals(other);
}
public bool Equals(IFoo other)
{
Console.WriteLine(Value + " > implicit Equals");
return base.Equals(other);
}
public void Bar() { }
public override int GetHashCode() { return base.GetHashCode(); }
}