2009-11-18 92 views
3

LinkedList.Contains方法。 (.NET 2)LinkedList.Contains。什么是用来比较对象的方法?

如何在内部比较对象? (Equals?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

(答道完整的例子评论) – 2009-11-19 16:01:06

+0

[反射镜](http://reflector.red-gate.com) – 2009-11-18 11:25:44

回答

1

的方法来实现的是等于。我需要实现基本的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); 
     } 
    } 
} 
+0

@serhio:一般这样的东西会被编辑到您的问题中[虽然您可能已经指出了开始] – 2009-11-18 13:21:11

+0

这已经是一个答案我发现,不是问题的一部分。 – serhio 2009-11-19 09:48:11

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)) {...} 
... 

更新,以证明该工作的时候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(); } 
} 
+0

是的,你可以看到我张贴的主题中的代码? 问题是linkedList包含一个接口。 但是对象也实现了IEquitable接口。 – serhio 2009-11-18 12:02:05

+0

不同'T';他们需要为'LinkedList '实施'IEquatable '来使用它。 – 2009-11-18 13:17:28

+0

或者更具体地说,您需要'IClass:IEquatable ',因为它对于所有**'IClass'实现都是正确的。 – 2009-11-18 16:26:09

相关问题