2010-10-16 77 views
1

让我们有这样的代码:搜索<T>

class student :IComparable , IComparable<student> 
{ 
    public string name = ""; 

    public override string ToString() 
    { 
     return name; 
    } 

    #region IComparable Members 

    public int CompareTo(object obj) 
    { 
     if (this.name.Equals(((student)obj).name)) 
      return 0 ; 
     else 
      return -1 ; 
    } 

    #endregion 

    #region IComparable<student> Members 

    public int CompareTo(student other) 
    { 
     if (this.name.Equals (other.name)) 
      return 0 ; 
     else 
      return -1 ; 
    } 

    #endregion 
} 

我是从这个类中主要像创建的LinkedList:

LinkedList<student> list = new LinkedList<student>(); 
list.AddLast(new student { name="Farah"}); 
list.AddLast(new student { name="Noor"}); 
list.AddLast(new student { name="Reem"}); 

foreach (student s in list) 
{ 
    Console.WriteLine(s); 
} 

它的打印: 法拉 努尔 REEM

但是当我尝试搜索任何元素时,它找不到它,如:

Console.WriteLine(list.Contains(new student{ name="Noor"})); 

This Print false虽然“学生”类实现了“IComparable,IComparable”!

我应该怎么做?

回答

2

问题:Contains不能用于IComparable接口。它使用Equals方法。 SO覆盖它:

public override bool Equals(object obj) 
    { 
     return this.CompareTo(((IComparable)obj)) == 0; 
    } 
+0

为什么要转换成'IComparable'? – dalle 2010-10-16 06:55:15

+0

@dalle - 只是为了使戏剧性的口音:) – Dewfy 2010-10-17 10:49:34

+0

铸造'学生'会更合适,并节省一小部分的指示。 – dalle 2010-10-17 14:37:34