C # Преобразование ArrayList Выборочная сортировка в общий список <T>Выборочная сортировка - PullRequest
2 голосов
/ 15 января 2010

У меня есть ArrayList объектов, которые мне нужно отсортировать по двум различным модам, в зависимости от ситуации. Я следовал этому примеру: http://codebetter.com/blogs/david.hayden/archive/2005/03/06/56584.aspx о том, как создать PersonComparer путем перегрузки объекта IComparer. Мне понравился этот метод, потому что он позволил мне создать перечислитель критериев сортировки, которые я мог бы установить на лету.

Однако, когда я преобразовываю свой ArrayList в общий тип List<T>, этот метод больше не работает. Когда я пытаюсь передать свой объект «сравнения», я получаю следующую ошибку:

«Наилучшее перегруженное соответствие метода для System.Collections.Generic.List.Sort содержит недопустимые аргументы»

Мой вопрос: что мне нужно изменить, чтобы этот метод работал? Или, что более важно, есть ли лучший способ создания нескольких пользовательских сортировок с использованием общих списков?

Ответы [ 3 ]

3 голосов
/ 15 января 2010

Список .Sort () take имеет перегрузку, которая принимает IComparer , List .Sort (IComparer ) . 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 голос
/ 15 января 2010

List.Sort принимает один параметр, который является делегатом следующего типа:

открытый делегат в Сравнении ( Т х, Ты )

Посмотрев на сообщение в блоге, которое вы связали, я обнаружил, что ваш метод принимает два объекта любого типа. Вы должны изменить свой метод так, чтобы он брал два объекта типа T (тип вашего Списка).

Пример:

Ваш метод, вероятно, похож на

int mymethod (объект a, объект b) { // что-то }

если ваш список является списком

тогда ваш метод должен выглядеть следующим образом

int mymethod (CustomClass a, CustomClass b) { // что-то }

Кроме того, это может выглядеть так

int MyMethod2 <T> (T a, T b) { // что-то }

0 голосов
/ 15 января 2010

Я предлагаю вам взглянуть на методы расширения LINQ OrderBy и ThenBy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...