LinkedList.Contains方法。 (.NET 2)
如何在里面比较物体? (等于?CompareTo?)
MSDN对此一无所知。
情况:
interface IClass
{
string GetName();
}
class Class1 : IClass, IEquatable<Class1>
{
public string FirstName;
public string LastName;
string IClass.GetName() { return FirstName; }
bool IEquatable<Class1>.Equals(Class1 other)
{
return FirstName.Equals(other.FirstName);
}
}
class Class2 : IClass, IEquatable<Class2>
{
public string FirstName;
public string LastName;
string IClass.GetName() { return LastName; }
bool IEquatable<Class2>.Equals(Class2 other)
{
return LastName.Equals(other.LastName);
}
}
public void TestMethod()
{
Class1 c1 = new Class1();
c1.FirstName = "fn";
c1.FirstName = "ln";
Class2 c2 = new Class2();
c2.FirstName = "fn";
c2.FirstName = "ln";
Class1 c3 = new Class1();
c3.FirstName = "fn";
c3.FirstName = "ln";
LinkedList<IClass> myList = new LinkedList<IClass>();
myList.AddFirst(c1);
myList.AddFirst(c2);
// false here
MessageBox.Show("myList<IClass> contains c3? - " + (myList.Contains(c3)));
LinkedList<Class1> myList1 = new LinkedList<Class1>();
myList1.AddFirst(c1);
myList1.AddFirst(c1);
// true here
MessageBox.Show("myList1<Class1> contains c3? - " + (myList1.Contains(c3)));
}
答案 0 :(得分:6)
由于链接列表不是字典,我期望使用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)) {...}
...
根据评论{<1}}更新以证明此工作正常:
ISomeInterface: IEquatable<ISomeInterface>
答案 1 :(得分:1)
实施的方法是Equals。我需要实现基本的Equals方法,而不一定是(?!)通用方法。
class Class1 : IClass, IEquatable<Class1>
{
public string FirstName;
public string LastName;
string IClass.GetName() { return FirstName; }
bool IEquatable<Class1>.Equals(Class1 other)
{
return FirstName.Equals(other.FirstName);
}
public override bool Equals(object obj)
{
if (obj is Class1)
{
return this.FirstName.Equals((obj as Class1).FirstName);
}
else
{
return base.Equals(obj);
}
}
}