Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Метод List<T>.Sort ()

 

Опубликовано: Октябрь 2016

Сортирует элементы во всем списке List<T> с помощью функции сравнения по умолчанию.

Пространство имен:   System.Collections.Generic
Сборка:  mscorlib (в mscorlib.dll)

Exception Condition
InvalidOperationException

Функция сравнения по умолчанию Comparer<T>.Default не может найти реализацию универсального интерфейса IComparable<T> или интерфейса IComparable для типа T.

Этот метод использует функцию сравнения по умолчанию Comparer<T>.Default для типа T для определения порядка элементов списка. Comparer<T>.Default Свойство проверяет, реализует ли тип T универсальный интерфейс IComparable<T> и использует эту реализацию, если он доступен. В противном случае Comparer<T>.Default проверяет, является ли тип T реализует IComparable интерфейса. Если тип T не реализует интерфейс либо, Comparer<T>.Default вызывает InvalidOperationException.

Этот метод использует Array.Sort метод, который применяется в разумной сортировки следующим образом:

  • Если размер раздела составляет менее 16 элементов, он использует алгоритм сортировки вставки.

  • Если количество секций превышает 2 * LogN, где N диапазон входного массива, в нем используется алгоритм Heapsort.

  • В противном случае он использует алгоритм Quicksort.

В этой реализации осуществляется нестрогая Сортировка; то есть если два элемента равны, их порядок может не сохраняться. Напротив при строгой сортировке сохраняется порядок равных элементов.

В среднем этот метод является операцией O (n log n) операции, где nCount; в худшем случае он является операцией O (n ^ 2) операции.

В следующем примере добавляется некоторые имена, чтобы List<String> вызывает объект, отображает список в неотсортированном порядке Sort метод и затем отображает отсортированного списка.

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      String[] names = { "Samuel", "Dakota", "Koani", "Saya", "Vanya",
                         "Yiska", "Yuma", "Jody", "Nikita" };
      var nameList = new List<String>();
      nameList.AddRange(names);
      Console.WriteLine("List in unsorted order: ");
      foreach (var name in nameList)
         Console.Write("   {0}", name);

      Console.WriteLine(Environment.NewLine);

      nameList.Sort();
      Console.WriteLine("List in sorted order: ");
      foreach (var name in nameList)
         Console.Write("   {0}", name);

      Console.WriteLine();
   }
}
// The example displays the following output:
//    List in unsorted order:
//       Samuel   Dakota   Koani   Saya   Vanya   Yiska   Yuma   Jody   Nikita
//
//    List in sorted order:
//       Dakota   Jody   Koani   Nikita   Samuel   Saya   Vanya   Yiska   Yuma

Следующий код демонстрирует Sort() и Sort(Comparison<T>) перегрузок метода простые бизнес-объекта. Вызов Sort() метод приводит к использованию компаратора по умолчанию для типа части и Sort(Comparison<T>) метод реализуется с помощью анонимного метода.

using System;
using System.Collections.Generic;
// Simple business object. A PartId is used to identify the type of part 
// but the part name can change. 
public class Part : IEquatable<Part> , IComparable<Part>
{
    public string PartName { get; set; }

    public int PartId { get; set; }

    public override string ToString()
    {
        return "ID: " + PartId + "   Name: " + PartName;
    }
    public override bool Equals(object obj)
    {
        if (obj == null) return false;
        Part objAsPart = obj as Part;
        if (objAsPart == null) return false;
        else return Equals(objAsPart);
    }
    public int SortByNameAscending(string name1, string name2)
    {

        return name1.CompareTo(name2);
    }

    // Default comparer for Part type.
    public int CompareTo(Part comparePart)
    {
          // A null value means that this object is greater.
        if (comparePart == null)
            return 1;

        else
            return this.PartId.CompareTo(comparePart.PartId);
    }
    public override int GetHashCode()
    {
        return PartId;
    }
    public bool Equals(Part other)
    {
        if (other == null) return false;
        return (this.PartId.Equals(other.PartId));
    }
    // Should also override == and != operators.

}
public class Example
{
    public static void Main()
    {
        // Create a list of parts.
        List<Part> parts = new List<Part>();

        // Add parts to the list.
        parts.Add(new Part() { PartName = "regular seat", PartId = 1434 });
        parts.Add(new Part() { PartName= "crank arm", PartId = 1234 });
        parts.Add(new Part() { PartName = "shift lever", PartId = 1634 }); ;
        // Name intentionally left null.
        parts.Add(new Part() {  PartId = 1334 });
        parts.Add(new Part() { PartName = "banana seat", PartId = 1444 });
        parts.Add(new Part() { PartName = "cassette", PartId = 1534 });


        // Write out the parts in the list. This will call the overridden 
        // ToString method in the Part class.
        Console.WriteLine("\nBefore sort:");
        foreach (Part aPart in parts)
        {
            Console.WriteLine(aPart);
        }


        // Call Sort on the list. This will use the 
        // default comparer, which is the Compare method 
        // implemented on Part.
        parts.Sort();


        Console.WriteLine("\nAfter sort by part number:");
        foreach (Part aPart in parts)
        {
            Console.WriteLine(aPart);
        }

        // This shows calling the Sort(Comparison(T) overload using 
        // an anonymous method for the Comparison delegate. 
        // This method treats null as the lesser of two values.
        parts.Sort(delegate(Part x, Part y)
        {
            if (x.PartName == null && y.PartName == null) return 0;
            else if (x.PartName == null) return -1;
            else if (y.PartName == null) return 1;
            else return x.PartName.CompareTo(y.PartName);
        });

        Console.WriteLine("\nAfter sort by name:");
        foreach (Part aPart in parts)
        {
            Console.WriteLine(aPart);
        }

        /*

            Before sort:
		ID: 1434   Name: regular seat
		ID: 1234   Name: crank arm
		ID: 1634   Name: shift lever
		ID: 1334   Name:
		ID: 1444   Name: banana seat
		ID: 1534   Name: cassette

	    After sort by part number:
		ID: 1234   Name: crank arm
		ID: 1334   Name:
		ID: 1434   Name: regular seat
		ID: 1444   Name: banana seat
		ID: 1534   Name: cassette
		ID: 1634   Name: shift lever

	    After sort by name:
		ID: 1334   Name:
		ID: 1444   Name: banana seat
		ID: 1534   Name: cassette
		ID: 1234   Name: crank arm
		ID: 1434   Name: regular seat
		ID: 1634   Name: shift lever

         */

    }
}

В следующем примере демонстрируется Sort() перегрузка метода и BinarySearch(T) перегрузка метода. A List<T> строк создается и заполняется четырьмя строками в произвольном порядке. Список отображается, сортировки и снова отобразить.

BinarySearch(T) Перегрузка метода используется для поиска двух строк, которых нет в списке, и Insert метод используется для вставки узлов. Возвращаемое значение BinarySearch метод отрицательное значение в каждом случае, поскольку эти строки не будут в списке. Поразрядное дополнение (~ оператор в C# и Visual C++, Xor -1 в Visual Basic) для этого отрицательного числа дает индекс первого элемента в списке, который больше, чем строка поиска и вставки в этом месте сохраняет порядок сортировки. Вторая искомая строка больше, чем любой элемент в списке, поэтому позицию вставки в конец списка.

using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        List<string> dinosaurs = new List<string>();

        dinosaurs.Add("Pachycephalosaurus");
        dinosaurs.Add("Amargasaurus");
        dinosaurs.Add("Mamenchisaurus");
        dinosaurs.Add("Deinonychus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nSort");
        dinosaurs.Sort();

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nBinarySearch and Insert \"Coelophysis\":");
        int index = dinosaurs.BinarySearch("Coelophysis");
        if (index < 0)
        {
            dinosaurs.Insert(~index, "Coelophysis");
        }

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nBinarySearch and Insert \"Tyrannosaurus\":");
        index = dinosaurs.BinarySearch("Tyrannosaurus");
        if (index < 0)
        {
            dinosaurs.Insert(~index, "Tyrannosaurus");
        }

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }
    }
}

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Deinonychus

Sort

Amargasaurus
Deinonychus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Coelophysis":

Amargasaurus
Coelophysis
Deinonychus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Tyrannosaurus":

Amargasaurus
Coelophysis
Deinonychus
Mamenchisaurus
Pachycephalosaurus
Tyrannosaurus
 */

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 2.0
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1
Вернуться в начало
Показ: