2010-01-15 60 views
2

我有一个对象的ArrayList,我需要在两种不同的方式,根据情况进行排序。我遵循这个例子:http://codebetter.com/blogs/david.hayden/archive/2005/03/06/56584.aspx关于如何通过重载IComparer对象来创建PersonComparer。我喜欢这个方法,因为它允许我建立一个我可以随时设置的排序标准的枚举器。C#转换ArrayList自定义排序到通用列表<T>自定义排序

但是,当我将我的ArrayList转换为通用的List<T>类型时,此方法不再有效。当我尝试通过我的“比较器”的对象,我得到以下错误:

“为“System.Collections.Generic.List.Sort有一些无效参数的最佳重载的方法匹配”

我的问题是:为了使这个方法有效,我需要改变什么?或者更重要的是,是否有更好的方式使用通用列表创建多个自定义排序?

+0

除了IComparer之外,还希望实现IComparer 接口。看到我下面的评论。 – jonp 2010-01-15 20:22:59

回答

3

List<T>.Sort()需要具有重载需要IComparer<T>,List<T>.Sort(IComparer<T>)IComparer<T>就像IComparer,但它是强类型的。

要让您的代码编译,您需要将您的IComparer实现更改为实现IComparer<T>。例如,如果您有List<Person>,那么比较器需要执行IComparer<Person>。例如:

class Person { 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

// Compares by FirstName then LastName 
class PersonComparer : IComparer, IComparer<Person> { 
    public int Compare(object x, object y) 
    { 
     var a = x as Person; 
     var b = y as Person; 
     return Compare(a, b); 
    } 

    public int Compare(Person x, Person y) 
    { 
     var comparisons = new Func<Person, Person, int>[]{ 
      (a, b) => a.FirstName.CompareTo (y.FirstName), 
      (a, b) => a.LastName.CompareTo (y.LastName), 
     }; 
     foreach (var f in comparisons) { 
      int c = f (x, y); 
      if (c != 0) 
       return c; 
     } 
     return 0; 
    } 
} 
0

我建议你看看LINQ扩展方法OrderByThenBy

1

List.Sort采用一个参数是以下类型的委托:

公共委托INT比较( 牛逼X, 牛逼ÿ )

看着你链接的博客文章后,我发现你的方法可能需要两个任何类型的对象。你应该改变你的方法来取两个类型为T的对象(你的列表的类型)。

例子:

你的方法可能是一样的东西

INT的MyMethod(对象A,对象B){// 东西 }

,如果你的目录是

那么你的方法应该看起来像这样

int mymethod(CustomClass a,CustomClass b) {// 东西 }

可替代地,它可以是这样的

INT MyMethod2 <T>(T A,T B){// 东西 }

+0

此方法不起作用,因为为了重载IComparer对象,您必须提供一个接受两个对象的CompareTo方法。 – Nitax 2010-01-15 19:50:19

+0

我建议你写一个与签名相同的方法: int MyMethod2 (T a,T b) 然后,只需将它传入列表 .Sort方法。不要创建一个实现IComparer的类,这种方法可以在任何你想要的地方生活。 – 2010-01-15 19:56:56

+0

好吧,我会试试看。我也通过改变IComparer对IComparer的影响来修正这个例子 Nitax 2010-01-15 20:00:18