C#转换ArrayList自定义排序到通用列表<t>自定义排序</t>

时间:2010-01-15 19:37:12

标签: generics sorting

我有一个对象的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列表创建多个自定义排序?

3 个答案:

答案 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扩展方法OrderByThenBy