2014-11-05 72 views
2

我有一個名爲Person的類,它實現IComparable<int> generic接口。我有一個通用的列表,其中包含人物對象,我將我的列表分配給一個數組,我正在排序列表,但我正在採取follwing錯誤。CompareTo()方法不起作用

error: {"Failed to compare two elements in the array."}

這是我的Person類

public class Person : IComparable<int> 
    { 
     public int Age { get; set; } 

     public int CompareTo(int other) 
     { 
      return Age.CompareTo(other); 
     } 
    } 

,並將該軟件CS

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Person> list2 = new List<Person>(); 

     list2.Add(new Person() { Age = 80 }); 
     list2.Add(new Person() { Age = 45 }); 
     list2.Add(new Person() { Age = 3 }); 
     list2.Add(new Person() { Age = 77 }); 
     list2.Add(new Person() { Age = 45 }); 

     Person[] array = list2.ToArray(); 
     Array.Sort(array); 

     foreach (Person item in array) 
     { 
      Console.WriteLine(item.Age); 
     } 

     Console.ReadKey(); 
    } 
} 
+0

錯誤是在排序方法 – 2014-11-05 15:58:11

+3

你必須實現'IComparable '使用它在'Person'數組上。 – 2014-11-05 15:59:42

+0

爲什麼要轉換爲數組?在使用[OrderBy](http://msdn.microsoft.com/en-us/library/vstudio/bb534966(v = vs.100).aspx)時重複列表。 – BCdotWEB 2014-11-05 16:00:17

回答

10

類改成這樣:如果你創建類IComperable<int>

public class Person : IComparable<Person> 
{ 
    public int Age { get; set; } 

    public int CompareTo(Person other) 
    { 
     return Age.CompareTo(other.Age); 
    } 
} 

你能夠比較用int表示,而不用同一個類。 您必須將與您比較的類相同的類/結構傳遞給模板。

+0

不編譯 – 2014-11-05 16:00:19

+0

對不起,缺失的空間 – 2014-11-05 16:01:07

+4

@downvoters,這是其中一個可能適合編輯某些代碼並在Person和其他人之間添加該空間的時間之一 – 2014-11-05 16:02:23

4

你需要改變你的通用的Person因爲你是比較個人對個人,而不是人來詮釋:

public class Person : IComparable<Person> 
    { 
     public int Age { get; set; } 


     public int CompareTo(Person other) 
     { 
      return Age.CompareTo(other.Age); 
     } 
    } 

而且,你不必強制轉換爲數組後,你可以把它作爲一個列表:

List<Person> list2 = new List<Person>(); 

      list2.Add(new Person() { Age = 80 }); 
      list2.Add(new Person() { Age = 45 }); 
      list2.Add(new Person() { Age = 3 }); 
      list2.Add(new Person() { Age = 77 }); 
      list2.Add(new Person() { Age = 45 }); 

      list2.Sort(); 

      foreach (Person item in list2) 
      { 
       Console.WriteLine(item.Age); 
      } 
+1

謝謝@Omri阿哈龍 – 2014-11-05 16:50:32

1

您可以實現Icompareable<Person>爲對方的回答狀態也可以實現IComparable像:

public class Person : IComparable 
{ 
    public int Age { get; set; } 

    public int CompareTo(int other) 
    { 
     return Age.CompareTo(other); 
    } 

    public int CompareTo(object obj) 
    { 
     Person otherPerson = obj as Person; 
     if (obj == null) 
      return 0; 
     else 
     { 

      return Age.CompareTo(otherPerson.Age); 
     } 
    } 
} 

您還可以使用LINQ訂購您的列表,如:

foreach (Person item in list2.OrderBy(r=> r.Age)) 
+0

謝謝@ user2711965但我想實施通用接口 – 2014-11-05 16:51:14

2

使用此: -

public class Person : IComparable<Person> 
    { 
     public int Age { get; set; } 

     public int CompareTo(Person other) 
     { 
      return this.Age.CompareTo(other.Age); 
     } 
    } 

您的自定義比較是錯誤的!的CompareTo()方法返回其指示一個整數: -

0 -> Current instance is equal to the object being compared. 
>0 -> Current instance is greater than the object being compared. 
<0 -> Current instance is less than the object being compared. 

當調用Array.Sort(array);你實際上傳遞數組對象,但問題是你已執行int類型的IComparable

+0

謝謝Rahul Singh。 – 2014-11-05 17:05:45