我有一个对象的ArrayList,我需要根据情况以两种不同的方式进行排序。我按照这个例子:http://codebetter.com/blogs/david.hayden/archive/2005/03/06/56584.aspx关于如何通过重载IComparer对象来创建PersonComparer。我喜欢这种方法,因为它允许我构建一个可以动态设置的排序标准的枚举器。
但是,当我将ArrayList转换为通用List<T>
类型时,此方法不再有效。当我尝试传递“comparer”对象时,出现以下错误:
“'System.Collections.Generic.List.Sort的最佳重载方法匹配有一些无效的参数”
我的问题是:我需要更改什么才能使此方法有效?或者更重要的是,有没有更好的方法使用Generic列表创建多个自定义排序?
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
List.Sort接受一个参数,该参数是以下类型的委托:
public delegate int Comparison( T x, 是的 )
在查看您链接的博客文章后,我发现您的方法可能需要两个任何类型的对象。您应该更改方法以获取T类型的两个对象(列表的类型)。
示例:
您的方法可能类似于
int mymethod(object a,object b){ //某事 }
如果您的列表是列表
那么你的方法应该是这样的
int mymethod(CustomClass a,CustomClass b){ //某事 }
或者,它可能看起来像这样
int MyMethod2 <T
&gt; (T a,T b){
//某事
}
答案 2 :(得分:0)
我建议您查看LINQ扩展方法OrderBy
和ThenBy
。