Как CompareTo сортирует список? - PullRequest
       6

Как CompareTo сортирует список?

3 голосов
/ 16 декабря 2011

Ниже приведен список l, который содержит список Product с Name и Price свойствами.Список может быть отсортирован по алфавиту следующим классом ProductNameComparer, который реализует IComparar .

List<Product> l = p.GetList();
l.Sort(new ProductNameComparer());
MessageBox.Show(l[0].Name);

public class ProductNameComparer : IComparer<Product>
{
    public int Compare(Product x, Product y)
    {
        return x.Name.CompareTo(y.Name);
    }
}

Я не понимаю, как сортируется список.Согласно MSDN CompareTo возвращает значение типа Int32 , равное меньше нуля , нулю или больше нуля .Если у меня есть:

string c = "Apple";
string d = "Orange";
return c.CompareTo(d)

Функция вернет " -1 ".

Но если я заменю l.Sort(-1) вместо l.Sort(new ProductNameComparer()), код не скомпилируется

Кроме того, почему Compare(Product x, Product y) принимает только два продукта в качестве аргумента и все же сумел сравнить и отсортироватьсписок (> 2) товаров?

Ответы [ 3 ]

10 голосов
/ 16 декабря 2011

Метод Sort не просто вызывает Compare один раз - он вызывает его несколько раз, когда ему нужно сравнить два элемента.Это общий алгоритм сортировки, который способен сортировать любую коллекцию элементов при условии, что он может сравнивать любые два из них согласованным образом.

Код не компилируется, если вы пытаетесь вызвать l.Sort(-1)потому что это просто попытка передать целое число - что бы это даже значило?

Вы должны понимать, что вы не предоставляете Sort метод один результат сравнения - выдавая ему возможность сравнивать любые нужные элементы.

6 голосов
/ 16 декабря 2011

Для демонстрации здесь возможна реализация метода Сортировки (я знаю, что он крайне неэффективен):

public void Sort(System.Collections.Generic.IComparer<T> comparer)
{
    for (int i = 0; i < this.Count - 1; i++)
    {
        for (int j = i + 1; j < this.Count; j++)
        {
            if (comparer.Compare(this[i], this[j]) > 0)
            {
                T tmp = this[i];
                this[i] = this[j];
                this[j] = tmp;
            }
        }
    }
}
1 голос
/ 16 декабря 2011

Перегрузка метода Sort, используемая в вашем примере (new ProductNameComparer()), требует, чтобы параметр реализовал интерфейс IComparer .Вызов Sort(-1) не будет работать, так как int не реализует этот интерфейс.Согласно @JonSkeet, результат вызова CompareTo() используется стратегией сортировки для упорядочивания списка.

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