2015-10-27 30 views
1

我應該調用接口的方法排序在其他類,其中包括列表 但我無法找到合適的解決方案,但我做的例子我的老師。接口IComparer的錯誤沒有重載方法「排序」需要兩個參數

錯誤:沒有過載的方法爲「排序」需要兩個參數。

類學生:人

public class SortByName : IComparer 
     { 
      int IComparer.Compare(object obj1, object obj2) 
      { 
       Student st1 = (Student)obj1; 
       Student st2 = (Student)obj2; 
       return st1.Name.CompareTo(st2.Name); 
      } 
     } 

類AcademyGroup:

List<Student> group;  
    --------//--------- 
    public void Sort() 
      { 
        group.Sort (group, new Student.SortByName()); 
      } 

回答

0

Sort通話的問題是,你正在試圖通過group兩次 - 一次是呼叫的目標.的左邊,再一次作爲該方法的第一個參數。

還有與接口的實現一個問題:你應該實現的通用版本。

這將解決這個問題:

using System.Collections.Generic; 
... 
public class SortByName : IComparer<Student> { 
    public int Compare(Student st1, Student st2) { 
     return st1.Name.CompareTo(st2.Name); 
    } 
} 
... 
group.Sort(new Student.SortByName()); 

注意IComparer<T>System.Collections.Generic命名空間中的一員,而你使用的是IComparer命名空間System.Collections的成員。如果您還需要非通用版本,則需要更改using指令或完全限定聲明。

+0

相反的指定或者非通用接口'IComparer'或者通用'IComparer '代替繼承'abstract'基類'Comparer '可能是一個好主意。仍然只需要提供一種方法。通過這種方式,您的類將成爲* IComparer和IComparer *,並且基類爲您提供必要的免費類型檢查。 –

+0

你甚至可以用lambda創建'Comparer '的實例。 'var sortByName = Comparer .Create((st1,st2)=> st1.Name.CompareTo(st2.Name));'。 –

0

List<T>.Sort需要一個通用的IComparer<T>,而不是非通用的IComparer。讓你的比較器通用:

public class SortByName : IComparer<Student> 
    { 
     int IComparer.Compare(Student st1, Student st2) 
     { 
      return st1.Name.CompareTo(st2.Name); 
     } 
    } 

而且,你不需要通過group作爲參數傳遞給group.Sort,只是通過比較器:

group.Sort (new Student.SortByName()); 
+0

我解決,但我:錯誤:非泛型類型「System.Collections.IComparer」不能與類型參數 –

+1

@AleksandrFursenko使用:你忘了'使用System.Collections.Generic;'在頂部你的文件。 –

+0

我對不起,但它包括:使用系統;使用System.IO的 ;使用System.Threading的 ;使用System.Collections的 ; using System.Collections.Generic; –

相關問題