Прочитать на английском

Поделиться через


Array.Sort Метод

Определение

Сортирует элементы в одномерном массиве.

Перегрузки

Sort(Array, Array, Int32, Int32, IComparer)

Сортирует диапазон элементов в паре одномерных объектов Array (один содержит ключи, а другой — соответствующие элементы) на основе ключей в первой Array с помощью указанного IComparer.

Sort(Array, Int32, Int32, IComparer)

Сортирует элементы в диапазоне элементов в одномерном Array с помощью указанного IComparer.

Sort(Array, Array, Int32, Int32)

Сортирует диапазон элементов в паре одномерных объектов Array (один содержит ключи и другой содержит соответствующие элементы) на основе ключей в первой Array с помощью IComparable реализации каждого ключа.

Sort(Array, Int32, Int32)

Сортирует элементы в диапазоне элементов в одномерном Array с помощью IComparable реализации каждого элемента Array.

Sort(Array, Array, IComparer)

Сортирует пару одномерных объектов Array (один содержит ключи и другой содержит соответствующие элементы) на основе ключей в первой Array с помощью указанного IComparer.

Sort(Array, Array)

Сортирует пару одномерных объектов Array (один содержит ключи и другой содержит соответствующие элементы) на основе ключей в первой Array с помощью IComparable реализации каждого ключа.

Sort(Array)

Сортирует элементы во всем одномерном Array с помощью IComparable реализации каждого элемента Array.

Sort(Array, IComparer)

Сортирует элементы в одномерном Array с помощью указанного IComparer.

Sort<T>(T[])

Сортирует элементы в целом Array с помощью реализации IComparable<T> универсального интерфейса каждого элемента Array.

Sort<T>(T[], IComparer<T>)

Сортирует элементы в Array с помощью указанного IComparer<T> универсального интерфейса.

Sort<T>(T[], Comparison<T>)

Сортирует элементы в Array с помощью указанного Comparison<T>.

Sort<T>(T[], Int32, Int32)

Сортирует элементы в диапазоне элементов в Array с помощью IComparable<T> реализации универсального интерфейса каждого элемента Array.

Sort<T>(T[], Int32, Int32, IComparer<T>)

Сортирует элементы в диапазоне элементов в Array с помощью указанного IComparer<T> универсального интерфейса.

Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>)

Сортирует диапазон элементов в паре объектов Array (один содержит ключи и другой содержит соответствующие элементы) на основе ключей в первой Array с помощью указанного IComparer<T> универсального интерфейса.

Sort<TKey,TValue>(TKey[], TValue[])

Сортирует пару объектов Array (один содержит ключи, а другой содержит соответствующие элементы) на основе ключей в первой Array с помощью IComparable<T> реализации универсального интерфейса каждого ключа.

Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>)

Сортирует пару объектов Array (один содержит ключи, а другой содержит соответствующие элементы) на основе ключей в первой Array с помощью указанного IComparer<T> универсального интерфейса.

Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)

Сортирует диапазон элементов в паре объектов Array (один содержит ключи, а другой содержит соответствующие элементы) на основе ключей в первой Array с помощью реализации универсального интерфейса IComparable<T> каждого ключа.

Sort(Array, Array, Int32, Int32, IComparer)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует диапазон элементов в паре одномерных объектов Array (один содержит ключи, а другой — соответствующие элементы) на основе ключей в первой Array с помощью указанного IComparer.

public static void Sort (Array keys, Array items, int index, int length, System.Collections.IComparer comparer);
public static void Sort (Array keys, Array? items, int index, int length, System.Collections.IComparer? comparer);

Параметры

keys
Array

Одномерный Array, содержащий ключи для сортировки.

items
Array

Одномерный Array, содержащий элементы, соответствующие каждому из ключей в keysArray.

-или-

null сортировку только keysArray.

index
Int32

Начальный индекс диапазона для сортировки.

length
Int32

Количество элементов в диапазоне для сортировки.

comparer
IComparer

Реализация IComparer, используемая при сравнении элементов.

-или-

null использовать реализацию IComparable каждого элемента.

Исключения

keys Array является многомерным.

-или-

items Array является многомерным.

index меньше нижней границы keys.

-или-

length меньше нуля.

items не null, а нижняя граница keys не соответствует нижней границе items.

-или-

items не null, а длина keys больше длины items.

-или-

index и length не указывают допустимый диапазон в keysArray.

-или-

items не null, а index и length не указывают допустимый диапазон в itemsArray.

-или-

Реализация comparer вызвала ошибку во время сортировки. Например, comparer может не возвращать значение 0 при сравнении элемента с самим собой.

comparer null, а один или несколько элементов в keysArray не реализуют интерфейс IComparable.

Примеры

В следующем примере кода показано, как сортировать два связанных массива, где первый массив содержит ключи, а второй массив содержит значения. Сортировки выполняются с помощью средства сравнения по умолчанию и настраиваемого средства сравнения, который изменяет порядок сортировки. Обратите внимание, что результат может отличаться в зависимости от текущей CultureInfo.

using System;
using System.Collections;

public class SamplesArray  {

   public class myReverserClass : IComparer  {

      // Calls CaseInsensitiveComparer.Compare with the parameters reversed.
      int IComparer.Compare( Object x, Object y )  {
          return( (new CaseInsensitiveComparer()).Compare( y, x ) );
      }
   }

   public static void Main()  {

      // Creates and initializes a new Array and a new custom comparer.
      String[] myKeys = { "red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange" };
      String[] myValues = { "strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe" };
      IComparer myComparer = new myReverserClass();

      // Displays the values of the Array.
      Console.WriteLine( "The Array initially contains the following values:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts a section of the Array using the default comparer.
      Array.Sort( myKeys, myValues, 1, 3 );
      Console.WriteLine( "After sorting a section of the Array using the default comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts a section of the Array using the reverse case-insensitive comparer.
      Array.Sort( myKeys, myValues, 1, 3, myComparer );
      Console.WriteLine( "After sorting a section of the Array using the reverse case-insensitive comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts the entire Array using the default comparer.
      Array.Sort( myKeys, myValues );
      Console.WriteLine( "After sorting the entire Array using the default comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts the entire Array using the reverse case-insensitive comparer.
      Array.Sort( myKeys, myValues, myComparer );
      Console.WriteLine( "After sorting the entire Array using the reverse case-insensitive comparer:" );
      PrintKeysAndValues( myKeys, myValues );
   }

   public static void PrintKeysAndValues( String[] myKeys, String[] myValues )  {
      for ( int i = 0; i < myKeys.Length; i++ )  {
         Console.WriteLine( "   {0,-10}: {1}", myKeys[i], myValues[i] );
      }
      Console.WriteLine();
   }
}


/*
This code produces the following output.

The Array initially contains the following values:
   red       : strawberries
   GREEN     : PEARS
   YELLOW    : LIMES
   BLUE      : BERRIES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting a section of the Array using the default comparer:
   red       : strawberries
   BLUE      : BERRIES
   GREEN     : PEARS
   YELLOW    : LIMES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting a section of the Array using the reverse case-insensitive comparer:
   red       : strawberries
   YELLOW    : LIMES
   GREEN     : PEARS
   BLUE      : BERRIES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting the entire Array using the default comparer:
   black     : olives
   BLUE      : BERRIES
   GREEN     : PEARS
   orange    : cantaloupe
   purple    : grapes
   red       : strawberries
   YELLOW    : LIMES

After sorting the entire Array using the reverse case-insensitive comparer:
   YELLOW    : LIMES
   red       : strawberries
   purple    : grapes
   orange    : cantaloupe
   GREEN     : PEARS
   BLUE      : BERRIES
   black     : olives

*/

Комментарии

Каждый ключ в keysArray имеет соответствующий элемент в itemsArray. При перепозиции ключа во время сортировки соответствующий элемент в itemsArray изменяется аналогично. Поэтому itemsArray сортируется в соответствии с расположением соответствующих ключей в keysArray.

Если comparernull, каждый ключ в указанном диапазоне элементов в keysArray должен реализовать интерфейс IComparable, чтобы иметь возможность сравнения с каждым другим ключом.

Можно сортировать, если есть больше элементов, чем ключи, но элементы, у которых нет соответствующих ключей, не будут отсортированы. Невозможно отсортировать, если есть больше ключей, чем элементы; при этом возникает ArgumentException.

Если сортировка не выполнена успешно, результаты не определены.

.NET включает предопределенные IComparer реализации, перечисленные в следующей таблице.

Реализация Описание
System.Collections.CaseInsensitiveComparer Сравнивает любые два объекта, но выполняет нечувствительное сравнение строк с регистром.
Comparer.Default Сравнивает любые два объекта с помощью соглашений сортировки текущего языка и региональных параметров.
Comparer.DefaultInvariant Сравнивает любые два объекта с помощью соглашений сортировки инвариантного языка и региональных параметров.
Comparer<T>.Default Сравнивает два объекта типа T с помощью порядка сортировки по умолчанию типа.

Вы также можете поддерживать пользовательские сравнения, предоставив экземпляр собственной реализации IComparer параметру comparer. В этом примере определяется пользовательская реализация IComparer, которая изменяет порядок сортировки по умолчанию и выполняет сравнение строк без учета регистра.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n), где nlength.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 16 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort(Array, Int32, Int32, IComparer)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы в диапазоне элементов в одномерном Array с помощью указанного IComparer.

public static void Sort (Array array, int index, int length, System.Collections.IComparer comparer);
public static void Sort (Array array, int index, int length, System.Collections.IComparer? comparer);

Параметры

array
Array

Одномерный Array сортировки.

index
Int32

Начальный индекс диапазона для сортировки.

length
Int32

Количество элементов в диапазоне для сортировки.

comparer
IComparer

Реализация IComparer, используемая при сравнении элементов.

-или-

null использовать реализацию IComparable каждого элемента.

Исключения

array null.

array является многомерным.

index меньше нижней границы array.

-или-

length меньше нуля.

index и length не указывают допустимый диапазон в array.

-или-

Реализация comparer вызвала ошибку во время сортировки. Например, comparer может не возвращать значение 0 при сравнении элемента с самим собой.

comparer null, а один или несколько элементов в array не реализуют интерфейс IComparable.

Примеры

В следующем примере кода показано, как сортировать значения в Array с помощью средства сравнения по умолчанию и пользовательского средства сравнения, который изменяет порядок сортировки. Обратите внимание, что результат может отличаться в зависимости от текущей CultureInfo.

using System;
using System.Collections;

public class ReverseComparer : IComparer
{
   // Call CaseInsensitiveComparer.Compare with the parameters reversed.
   public int Compare(Object x, Object y)
   {
       return (new CaseInsensitiveComparer()).Compare(y, x );
   }
}

public class Example
{
   public static void Main()
   {
      // Create and initialize a new array.
      String[] words = { "The", "QUICK", "BROWN", "FOX", "jumps",
                         "over", "the", "lazy", "dog" };
      // Instantiate the reverse comparer.
      IComparer revComparer = new ReverseComparer();

      // Display the values of the array.
      Console.WriteLine( "The original order of elements in the array:" );
      DisplayValues(words);

      // Sort a section of the array using the default comparer.
      Array.Sort(words, 1, 3);
      Console.WriteLine( "After sorting elements 1-3 by using the default comparer:");
      DisplayValues(words);

      // Sort a section of the array using the reverse case-insensitive comparer.
      Array.Sort(words, 1, 3, revComparer);
      Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:");
      DisplayValues(words);

      // Sort the entire array using the default comparer.
      Array.Sort(words);
      Console.WriteLine( "After sorting the entire array by using the default comparer:");
      DisplayValues(words);

      // Sort the entire array by using the reverse case-insensitive comparer.
      Array.Sort(words, revComparer);
      Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:");
      DisplayValues(words);
   }

   public static void DisplayValues(String[] arr)
   {
      for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
            i++ )  {
         Console.WriteLine( "   [{0}] : {1}", i, arr[i] );
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    The original order of elements in the array:
//       [0] : The
//       [1] : QUICK
//       [2] : BROWN
//       [3] : FOX
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting elements 1-3 by using the default comparer:
//       [0] : The
//       [1] : BROWN
//       [2] : FOX
//       [3] : QUICK
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting elements 1-3 by using the reverse case-insensitive comparer:
//       [0] : The
//       [1] : QUICK
//       [2] : FOX
//       [3] : BROWN
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting the entire array by using the default comparer:
//       [0] : BROWN
//       [1] : dog
//       [2] : FOX
//       [3] : jumps
//       [4] : lazy
//       [5] : over
//       [6] : QUICK
//       [7] : the
//       [8] : The
//
//    After sorting the entire array using the reverse case-insensitive comparer:
//       [0] : the
//       [1] : The
//       [2] : QUICK
//       [3] : over
//       [4] : lazy
//       [5] : jumps
//       [6] : FOX
//       [7] : dog
//       [8] : BROWN

Комментарии

Если comparernull, каждый элемент в указанном диапазоне элементов в array должен реализовать интерфейс IComparable, чтобы иметь возможность сравнения с каждым другим элементом в array.

Если сортировка не выполнена успешно, результаты не определены.

.NET включает предопределенные IComparer реализации, перечисленные в следующей таблице.

Реализация Описание
System.Collections.CaseInsensitiveComparer Сравнивает любые два объекта, но выполняет нечувствительное сравнение строк с регистром.
Comparer.Default Сравнивает любые два объекта с помощью соглашений сортировки текущего языка и региональных параметров.
Comparer.DefaultInvariant Сравнивает любые два объекта с помощью соглашений сортировки инвариантного языка и региональных параметров.
Comparer<T>.Default Сравнивает два объекта типа T с помощью порядка сортировки по умолчанию типа.

Вы также можете поддерживать пользовательские сравнения, предоставив экземпляр собственной реализации IComparer параметру comparer. В этом примере определяется класс ReverseComparer, который изменяет порядок сортировки по умолчанию для экземпляров типа и выполняет сравнение строк без учета регистра.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n), где nlength.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 16 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort(Array, Array, Int32, Int32)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует диапазон элементов в паре одномерных объектов Array (один содержит ключи и другой содержит соответствующие элементы) на основе ключей в первой Array с помощью IComparable реализации каждого ключа.

public static void Sort (Array keys, Array items, int index, int length);
public static void Sort (Array keys, Array? items, int index, int length);

Параметры

keys
Array

Одномерный Array, содержащий ключи для сортировки.

items
Array

Одномерный Array, содержащий элементы, соответствующие каждому из ключей в keysArray.

-или-

null сортировку только keysArray.

index
Int32

Начальный индекс диапазона для сортировки.

length
Int32

Количество элементов в диапазоне для сортировки.

Исключения

keys Array является многомерным.

-или-

items Array является многомерным.

index меньше нижней границы keys.

-или-

length меньше нуля.

items не null, а длина keys больше длины items.

-или-

index и length не указывают допустимый диапазон в keysArray.

-или-

items не null, а index и length не указывают допустимый диапазон в itemsArray.

Один или несколько элементов в keysArray не реализуют интерфейс IComparable.

Примеры

В следующем примере кода показано, как сортировать два связанных массива, где первый массив содержит ключи, а второй массив содержит значения. Сортировки выполняются с помощью средства сравнения по умолчанию и настраиваемого средства сравнения, который изменяет порядок сортировки. Обратите внимание, что результат может отличаться в зависимости от текущей CultureInfo.

using System;
using System.Collections;

public class SamplesArray  {

   public class myReverserClass : IComparer  {

      // Calls CaseInsensitiveComparer.Compare with the parameters reversed.
      int IComparer.Compare( Object x, Object y )  {
          return( (new CaseInsensitiveComparer()).Compare( y, x ) );
      }
   }

   public static void Main()  {

      // Creates and initializes a new Array and a new custom comparer.
      String[] myKeys = { "red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange" };
      String[] myValues = { "strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe" };
      IComparer myComparer = new myReverserClass();

      // Displays the values of the Array.
      Console.WriteLine( "The Array initially contains the following values:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts a section of the Array using the default comparer.
      Array.Sort( myKeys, myValues, 1, 3 );
      Console.WriteLine( "After sorting a section of the Array using the default comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts a section of the Array using the reverse case-insensitive comparer.
      Array.Sort( myKeys, myValues, 1, 3, myComparer );
      Console.WriteLine( "After sorting a section of the Array using the reverse case-insensitive comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts the entire Array using the default comparer.
      Array.Sort( myKeys, myValues );
      Console.WriteLine( "After sorting the entire Array using the default comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts the entire Array using the reverse case-insensitive comparer.
      Array.Sort( myKeys, myValues, myComparer );
      Console.WriteLine( "After sorting the entire Array using the reverse case-insensitive comparer:" );
      PrintKeysAndValues( myKeys, myValues );
   }

   public static void PrintKeysAndValues( String[] myKeys, String[] myValues )  {
      for ( int i = 0; i < myKeys.Length; i++ )  {
         Console.WriteLine( "   {0,-10}: {1}", myKeys[i], myValues[i] );
      }
      Console.WriteLine();
   }
}


/*
This code produces the following output.

The Array initially contains the following values:
   red       : strawberries
   GREEN     : PEARS
   YELLOW    : LIMES
   BLUE      : BERRIES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting a section of the Array using the default comparer:
   red       : strawberries
   BLUE      : BERRIES
   GREEN     : PEARS
   YELLOW    : LIMES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting a section of the Array using the reverse case-insensitive comparer:
   red       : strawberries
   YELLOW    : LIMES
   GREEN     : PEARS
   BLUE      : BERRIES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting the entire Array using the default comparer:
   black     : olives
   BLUE      : BERRIES
   GREEN     : PEARS
   orange    : cantaloupe
   purple    : grapes
   red       : strawberries
   YELLOW    : LIMES

After sorting the entire Array using the reverse case-insensitive comparer:
   YELLOW    : LIMES
   red       : strawberries
   purple    : grapes
   orange    : cantaloupe
   GREEN     : PEARS
   BLUE      : BERRIES
   black     : olives

*/

Комментарии

Каждый ключ в keysArray имеет соответствующий элемент в itemsArray. При перепозиции ключа во время сортировки соответствующий элемент в itemsArray изменяется аналогично. Поэтому itemsArray сортируется в соответствии с расположением соответствующих ключей в keysArray.

Каждый ключ в заданном диапазоне элементов в keysArray должен реализовать интерфейс IComparable, чтобы иметь возможность сравнения с каждым другим ключом.

Можно сортировать, если есть больше элементов, чем ключи, но элементы, у которых нет соответствующих ключей, не будут отсортированы. Невозможно отсортировать, если есть больше ключей, чем элементы; при этом возникает ArgumentException.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n), где nlength.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort(Array, Int32, Int32)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы в диапазоне элементов в одномерном Array с помощью IComparable реализации каждого элемента Array.

public static void Sort (Array array, int index, int length);

Параметры

array
Array

Одномерный Array сортировки.

index
Int32

Начальный индекс диапазона для сортировки.

length
Int32

Количество элементов в диапазоне для сортировки.

Исключения

array null.

array является многомерным.

index меньше нижней границы array.

-или-

length меньше нуля.

index и length не указывают допустимый диапазон в array.

Один или несколько элементов в array не реализуют интерфейс IComparable.

Примеры

В следующем примере кода показано, как сортировать значения в Array с помощью средства сравнения по умолчанию и пользовательского средства сравнения, который изменяет порядок сортировки. Обратите внимание, что результат может отличаться в зависимости от текущей CultureInfo.

using System;
using System.Collections;

public class ReverseComparer : IComparer
{
   // Call CaseInsensitiveComparer.Compare with the parameters reversed.
   public int Compare(Object x, Object y)
   {
       return (new CaseInsensitiveComparer()).Compare(y, x );
   }
}

public class Example
{
   public static void Main()
   {
      // Create and initialize a new array.
      String[] words = { "The", "QUICK", "BROWN", "FOX", "jumps",
                         "over", "the", "lazy", "dog" };
      // Instantiate the reverse comparer.
      IComparer revComparer = new ReverseComparer();

      // Display the values of the array.
      Console.WriteLine( "The original order of elements in the array:" );
      DisplayValues(words);

      // Sort a section of the array using the default comparer.
      Array.Sort(words, 1, 3);
      Console.WriteLine( "After sorting elements 1-3 by using the default comparer:");
      DisplayValues(words);

      // Sort a section of the array using the reverse case-insensitive comparer.
      Array.Sort(words, 1, 3, revComparer);
      Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:");
      DisplayValues(words);

      // Sort the entire array using the default comparer.
      Array.Sort(words);
      Console.WriteLine( "After sorting the entire array by using the default comparer:");
      DisplayValues(words);

      // Sort the entire array by using the reverse case-insensitive comparer.
      Array.Sort(words, revComparer);
      Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:");
      DisplayValues(words);
   }

   public static void DisplayValues(String[] arr)
   {
      for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
            i++ )  {
         Console.WriteLine( "   [{0}] : {1}", i, arr[i] );
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    The original order of elements in the array:
//       [0] : The
//       [1] : QUICK
//       [2] : BROWN
//       [3] : FOX
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting elements 1-3 by using the default comparer:
//       [0] : The
//       [1] : BROWN
//       [2] : FOX
//       [3] : QUICK
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting elements 1-3 by using the reverse case-insensitive comparer:
//       [0] : The
//       [1] : QUICK
//       [2] : FOX
//       [3] : BROWN
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting the entire array by using the default comparer:
//       [0] : BROWN
//       [1] : dog
//       [2] : FOX
//       [3] : jumps
//       [4] : lazy
//       [5] : over
//       [6] : QUICK
//       [7] : the
//       [8] : The
//
//    After sorting the entire array using the reverse case-insensitive comparer:
//       [0] : the
//       [1] : The
//       [2] : QUICK
//       [3] : over
//       [4] : lazy
//       [5] : jumps
//       [6] : FOX
//       [7] : dog
//       [8] : BROWN

Комментарии

Каждый элемент в заданном диапазоне элементов в array должен реализовать интерфейс IComparable, который может сравниваться с каждым другим элементом в array.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n), где nlength.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort(Array, Array, IComparer)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует пару одномерных объектов Array (один содержит ключи и другой содержит соответствующие элементы) на основе ключей в первой Array с помощью указанного IComparer.

public static void Sort (Array keys, Array items, System.Collections.IComparer comparer);
public static void Sort (Array keys, Array? items, System.Collections.IComparer? comparer);

Параметры

keys
Array

Одномерный Array, содержащий ключи для сортировки.

items
Array

Одномерный Array, содержащий элементы, соответствующие каждому из ключей в keysArray.

-или-

null сортировку только keysArray.

comparer
IComparer

Реализация IComparer, используемая при сравнении элементов.

-или-

null использовать реализацию IComparable каждого элемента.

Исключения

keys Array является многомерным.

-или-

items Array является многомерным.

items не null, а длина keys больше длины items.

-или-

Реализация comparer вызвала ошибку во время сортировки. Например, comparer может не возвращать значение 0 при сравнении элемента с самим собой.

comparer null, а один или несколько элементов в keysArray не реализуют интерфейс IComparable.

Примеры

В следующем примере показано, как сортировать два связанных массива, где первый массив содержит ключи, а второй массив содержит значения. Сортировки выполняются с помощью средства сравнения по умолчанию и настраиваемого средства сравнения, который изменяет порядок сортировки. Обратите внимание, что результат может отличаться в зависимости от текущей CultureInfo.

using System;
using System.Collections;

public class SamplesArray  {

   public class myReverserClass : IComparer  {

      // Calls CaseInsensitiveComparer.Compare with the parameters reversed.
      int IComparer.Compare( Object x, Object y )  {
          return( (new CaseInsensitiveComparer()).Compare( y, x ) );
      }
   }

   public static void Main()  {

      // Creates and initializes a new Array and a new custom comparer.
      String[] myKeys = { "red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange" };
      String[] myValues = { "strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe" };
      IComparer myComparer = new myReverserClass();

      // Displays the values of the Array.
      Console.WriteLine( "The Array initially contains the following values:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts a section of the Array using the default comparer.
      Array.Sort( myKeys, myValues, 1, 3 );
      Console.WriteLine( "After sorting a section of the Array using the default comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts a section of the Array using the reverse case-insensitive comparer.
      Array.Sort( myKeys, myValues, 1, 3, myComparer );
      Console.WriteLine( "After sorting a section of the Array using the reverse case-insensitive comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts the entire Array using the default comparer.
      Array.Sort( myKeys, myValues );
      Console.WriteLine( "After sorting the entire Array using the default comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts the entire Array using the reverse case-insensitive comparer.
      Array.Sort( myKeys, myValues, myComparer );
      Console.WriteLine( "After sorting the entire Array using the reverse case-insensitive comparer:" );
      PrintKeysAndValues( myKeys, myValues );
   }

   public static void PrintKeysAndValues( String[] myKeys, String[] myValues )  {
      for ( int i = 0; i < myKeys.Length; i++ )  {
         Console.WriteLine( "   {0,-10}: {1}", myKeys[i], myValues[i] );
      }
      Console.WriteLine();
   }
}


/*
This code produces the following output.

The Array initially contains the following values:
   red       : strawberries
   GREEN     : PEARS
   YELLOW    : LIMES
   BLUE      : BERRIES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting a section of the Array using the default comparer:
   red       : strawberries
   BLUE      : BERRIES
   GREEN     : PEARS
   YELLOW    : LIMES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting a section of the Array using the reverse case-insensitive comparer:
   red       : strawberries
   YELLOW    : LIMES
   GREEN     : PEARS
   BLUE      : BERRIES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting the entire Array using the default comparer:
   black     : olives
   BLUE      : BERRIES
   GREEN     : PEARS
   orange    : cantaloupe
   purple    : grapes
   red       : strawberries
   YELLOW    : LIMES

After sorting the entire Array using the reverse case-insensitive comparer:
   YELLOW    : LIMES
   red       : strawberries
   purple    : grapes
   orange    : cantaloupe
   GREEN     : PEARS
   BLUE      : BERRIES
   black     : olives

*/

Комментарии

Каждый ключ в keysArray имеет соответствующий элемент в itemsArray. При перепозиции ключа во время сортировки соответствующий элемент в itemsArray изменяется аналогично. Поэтому itemsArray сортируется в соответствии с расположением соответствующих ключей в keysArray.

Если comparernull, каждый ключ в keysArray должен реализовать интерфейс IComparable для сравнения с каждым другим ключом.

Можно сортировать, если есть больше элементов, чем ключи, но элементы, у которых нет соответствующих ключей, не будут отсортированы. Невозможно отсортировать, если есть больше ключей, чем элементы; при этом возникает ArgumentException.

Если сортировка не выполнена успешно, результаты не определены.

.NET включает предопределенные IComparer реализации, перечисленные в следующей таблице.

Реализация Описание
System.Collections.CaseInsensitiveComparer Сравнивает любые два объекта, но выполняет нечувствительное сравнение строк с регистром.
Comparer.Default Сравнивает любые два объекта с помощью соглашений сортировки текущего языка и региональных параметров.
Comparer.DefaultInvariant Сравнивает любые два объекта с помощью соглашений сортировки инвариантного языка и региональных параметров.
Comparer<T>.Default Сравнивает два объекта типа T с помощью порядка сортировки по умолчанию типа.

Вы также можете поддерживать пользовательские сравнения, предоставив экземпляр собственной реализации IComparer параметру comparer. В этом примере определяется реализация IComparer, которая изменяет порядок сортировки по умолчанию и выполняет сравнение строк без учета регистра.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengthkeys.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 16 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort(Array, Array)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует пару одномерных объектов Array (один содержит ключи и другой содержит соответствующие элементы) на основе ключей в первой Array с помощью IComparable реализации каждого ключа.

public static void Sort (Array keys, Array items);
public static void Sort (Array keys, Array? items);

Параметры

keys
Array

Одномерный Array, содержащий ключи для сортировки.

items
Array

Одномерный Array, содержащий элементы, соответствующие каждому из ключей в keysArray.

-или-

null сортировку только keysArray.

Исключения

keys Array является многомерным.

-или-

items Array является многомерным.

items не null, а длина keys больше длины items.

Один или несколько элементов в keysArray не реализуют интерфейс IComparable.

Примеры

В следующем примере показано, как сортировать два связанных массива, где первый массив содержит ключи, а второй массив содержит значения. Сортировки выполняются с помощью средства сравнения по умолчанию и настраиваемого средства сравнения, который изменяет порядок сортировки. Обратите внимание, что результат может отличаться в зависимости от текущей CultureInfo.

using System;
using System.Collections;

public class SamplesArray  {

   public class myReverserClass : IComparer  {

      // Calls CaseInsensitiveComparer.Compare with the parameters reversed.
      int IComparer.Compare( Object x, Object y )  {
          return( (new CaseInsensitiveComparer()).Compare( y, x ) );
      }
   }

   public static void Main()  {

      // Creates and initializes a new Array and a new custom comparer.
      String[] myKeys = { "red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange" };
      String[] myValues = { "strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloupe" };
      IComparer myComparer = new myReverserClass();

      // Displays the values of the Array.
      Console.WriteLine( "The Array initially contains the following values:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts a section of the Array using the default comparer.
      Array.Sort( myKeys, myValues, 1, 3 );
      Console.WriteLine( "After sorting a section of the Array using the default comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts a section of the Array using the reverse case-insensitive comparer.
      Array.Sort( myKeys, myValues, 1, 3, myComparer );
      Console.WriteLine( "After sorting a section of the Array using the reverse case-insensitive comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts the entire Array using the default comparer.
      Array.Sort( myKeys, myValues );
      Console.WriteLine( "After sorting the entire Array using the default comparer:" );
      PrintKeysAndValues( myKeys, myValues );

      // Sorts the entire Array using the reverse case-insensitive comparer.
      Array.Sort( myKeys, myValues, myComparer );
      Console.WriteLine( "After sorting the entire Array using the reverse case-insensitive comparer:" );
      PrintKeysAndValues( myKeys, myValues );
   }

   public static void PrintKeysAndValues( String[] myKeys, String[] myValues )  {
      for ( int i = 0; i < myKeys.Length; i++ )  {
         Console.WriteLine( "   {0,-10}: {1}", myKeys[i], myValues[i] );
      }
      Console.WriteLine();
   }
}


/*
This code produces the following output.

The Array initially contains the following values:
   red       : strawberries
   GREEN     : PEARS
   YELLOW    : LIMES
   BLUE      : BERRIES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting a section of the Array using the default comparer:
   red       : strawberries
   BLUE      : BERRIES
   GREEN     : PEARS
   YELLOW    : LIMES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting a section of the Array using the reverse case-insensitive comparer:
   red       : strawberries
   YELLOW    : LIMES
   GREEN     : PEARS
   BLUE      : BERRIES
   purple    : grapes
   black     : olives
   orange    : cantaloupe

After sorting the entire Array using the default comparer:
   black     : olives
   BLUE      : BERRIES
   GREEN     : PEARS
   orange    : cantaloupe
   purple    : grapes
   red       : strawberries
   YELLOW    : LIMES

After sorting the entire Array using the reverse case-insensitive comparer:
   YELLOW    : LIMES
   red       : strawberries
   purple    : grapes
   orange    : cantaloupe
   GREEN     : PEARS
   BLUE      : BERRIES
   black     : olives

*/

Комментарии

Каждый ключ в keysArray имеет соответствующий элемент в itemsArray. При перепозиции ключа во время сортировки соответствующий элемент в itemsArray изменяется аналогично. Поэтому itemsArray сортируется в соответствии с расположением соответствующих ключей в keysArray.

Каждый ключ в keysArray должен реализовать интерфейс IComparable, чтобы иметь возможность сравнения с каждым другим ключом.

Можно сортировать, если есть больше элементов, чем ключи, но элементы, у которых нет соответствующих ключей, не будут отсортированы. Невозможно отсортировать, если есть больше ключей, чем элементы; при этом возникает ArgumentException.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengthkeys.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort(Array)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы во всем одномерном Array с помощью IComparable реализации каждого элемента Array.

public static void Sort (Array array);

Параметры

array
Array

Одномерный Array сортировки.

Исключения

array null.

array является многомерным.

Один или несколько элементов в array не реализуют интерфейс IComparable.

Примеры

В следующем примере кода показано, как сортировать значения в Array с помощью средства сравнения по умолчанию и пользовательского средства сравнения, который изменяет порядок сортировки. Обратите внимание, что результат может отличаться в зависимости от текущей CultureInfo.

using System;
using System.Collections;

public class ReverseComparer : IComparer
{
   // Call CaseInsensitiveComparer.Compare with the parameters reversed.
   public int Compare(Object x, Object y)
   {
       return (new CaseInsensitiveComparer()).Compare(y, x );
   }
}

public class Example
{
   public static void Main()
   {
      // Create and initialize a new array.
      String[] words = { "The", "QUICK", "BROWN", "FOX", "jumps",
                         "over", "the", "lazy", "dog" };
      // Instantiate the reverse comparer.
      IComparer revComparer = new ReverseComparer();

      // Display the values of the array.
      Console.WriteLine( "The original order of elements in the array:" );
      DisplayValues(words);

      // Sort a section of the array using the default comparer.
      Array.Sort(words, 1, 3);
      Console.WriteLine( "After sorting elements 1-3 by using the default comparer:");
      DisplayValues(words);

      // Sort a section of the array using the reverse case-insensitive comparer.
      Array.Sort(words, 1, 3, revComparer);
      Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:");
      DisplayValues(words);

      // Sort the entire array using the default comparer.
      Array.Sort(words);
      Console.WriteLine( "After sorting the entire array by using the default comparer:");
      DisplayValues(words);

      // Sort the entire array by using the reverse case-insensitive comparer.
      Array.Sort(words, revComparer);
      Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:");
      DisplayValues(words);
   }

   public static void DisplayValues(String[] arr)
   {
      for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
            i++ )  {
         Console.WriteLine( "   [{0}] : {1}", i, arr[i] );
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    The original order of elements in the array:
//       [0] : The
//       [1] : QUICK
//       [2] : BROWN
//       [3] : FOX
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting elements 1-3 by using the default comparer:
//       [0] : The
//       [1] : BROWN
//       [2] : FOX
//       [3] : QUICK
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting elements 1-3 by using the reverse case-insensitive comparer:
//       [0] : The
//       [1] : QUICK
//       [2] : FOX
//       [3] : BROWN
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting the entire array by using the default comparer:
//       [0] : BROWN
//       [1] : dog
//       [2] : FOX
//       [3] : jumps
//       [4] : lazy
//       [5] : over
//       [6] : QUICK
//       [7] : the
//       [8] : The
//
//    After sorting the entire array using the reverse case-insensitive comparer:
//       [0] : the
//       [1] : The
//       [2] : QUICK
//       [3] : over
//       [4] : lazy
//       [5] : jumps
//       [6] : FOX
//       [7] : dog
//       [8] : BROWN

Комментарии

Каждый элемент array должен реализовать интерфейс IComparable, чтобы иметь возможность сравнения с каждым другим элементом в array.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengtharray.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort(Array, IComparer)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы в одномерном Array с помощью указанного IComparer.

public static void Sort (Array array, System.Collections.IComparer comparer);
public static void Sort (Array array, System.Collections.IComparer? comparer);

Параметры

array
Array

Одномерный массив для сортировки.

comparer
IComparer

Реализация, используемая при сравнении элементов.

-или-

null использовать реализацию IComparable каждого элемента.

Исключения

array null.

array является многомерным.

comparer null, а один или несколько элементов в array не реализуют интерфейс IComparable.

Реализация comparer вызвала ошибку во время сортировки. Например, comparer может не возвращать значение 0 при сравнении элемента с самим собой.

Примеры

В следующем примере сортируются значения в строковом массиве с помощью средства сравнения по умолчанию. Он также определяет пользовательскую реализацию IComparer с именем ReverseComparer, которая изменяет порядок сортировки объекта по умолчанию при выполнении сравнения строк без учета регистра. Обратите внимание, что выходные данные могут отличаться в зависимости от текущего языка и региональных параметров.

using System;
using System.Collections;

public class ReverseComparer : IComparer
{
   // Call CaseInsensitiveComparer.Compare with the parameters reversed.
   public int Compare(Object x, Object y)
   {
       return (new CaseInsensitiveComparer()).Compare(y, x );
   }
}

public class Example
{
   public static void Main()
   {
      // Create and initialize a new array.
      String[] words = { "The", "QUICK", "BROWN", "FOX", "jumps",
                         "over", "the", "lazy", "dog" };
      // Instantiate the reverse comparer.
      IComparer revComparer = new ReverseComparer();

      // Display the values of the array.
      Console.WriteLine( "The original order of elements in the array:" );
      DisplayValues(words);

      // Sort a section of the array using the default comparer.
      Array.Sort(words, 1, 3);
      Console.WriteLine( "After sorting elements 1-3 by using the default comparer:");
      DisplayValues(words);

      // Sort a section of the array using the reverse case-insensitive comparer.
      Array.Sort(words, 1, 3, revComparer);
      Console.WriteLine( "After sorting elements 1-3 by using the reverse case-insensitive comparer:");
      DisplayValues(words);

      // Sort the entire array using the default comparer.
      Array.Sort(words);
      Console.WriteLine( "After sorting the entire array by using the default comparer:");
      DisplayValues(words);

      // Sort the entire array by using the reverse case-insensitive comparer.
      Array.Sort(words, revComparer);
      Console.WriteLine( "After sorting the entire array using the reverse case-insensitive comparer:");
      DisplayValues(words);
   }

   public static void DisplayValues(String[] arr)
   {
      for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
            i++ )  {
         Console.WriteLine( "   [{0}] : {1}", i, arr[i] );
      }
      Console.WriteLine();
   }
}
// The example displays the following output:
//    The original order of elements in the array:
//       [0] : The
//       [1] : QUICK
//       [2] : BROWN
//       [3] : FOX
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting elements 1-3 by using the default comparer:
//       [0] : The
//       [1] : BROWN
//       [2] : FOX
//       [3] : QUICK
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting elements 1-3 by using the reverse case-insensitive comparer:
//       [0] : The
//       [1] : QUICK
//       [2] : FOX
//       [3] : BROWN
//       [4] : jumps
//       [5] : over
//       [6] : the
//       [7] : lazy
//       [8] : dog
//
//    After sorting the entire array by using the default comparer:
//       [0] : BROWN
//       [1] : dog
//       [2] : FOX
//       [3] : jumps
//       [4] : lazy
//       [5] : over
//       [6] : QUICK
//       [7] : the
//       [8] : The
//
//    After sorting the entire array using the reverse case-insensitive comparer:
//       [0] : the
//       [1] : The
//       [2] : QUICK
//       [3] : over
//       [4] : lazy
//       [5] : jumps
//       [6] : FOX
//       [7] : dog
//       [8] : BROWN

Комментарии

Если comparernull, каждый элемент array должен реализовать интерфейс IComparable для сравнения с каждым другим элементом в array.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengtharray.

.NET включает предопределенные IComparer реализации, перечисленные в следующей таблице.

Реализация Описание
System.Collections.CaseInsensitiveComparer Сравнивает любые два объекта, но выполняет нечувствительное сравнение строк с регистром.
Comparer.Default Сравнивает любые два объекта с помощью соглашений сортировки текущего языка и региональных параметров.
Comparer.DefaultInvariant Сравнивает любые два объекта с помощью соглашений сортировки инвариантного языка и региональных параметров.
Comparer<T>.Default Сравнивает два объекта типа T с помощью порядка сортировки по умолчанию типа.

Вы также можете поддерживать пользовательские сравнения, предоставив экземпляр собственной реализации IComparer параметру comparer. В этом примере определяется класс ReverseComparer, который изменяет порядок сортировки по умолчанию для экземпляров типа и выполняет сравнение строк без учета регистра.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 16 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<T>(T[])

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы в целом Array с помощью реализации IComparable<T> универсального интерфейса каждого элемента Array.

public static void Sort<T> (T[] array);

Параметры типа

T

Тип элементов массива.

Параметры

array
T[]

Одномерный отсчитываемый от нуля Array сортировки.

Исключения

array null.

Один или несколько элементов в array не реализуют универсальный интерфейс IComparable<T>.

Примеры

В следующем примере кода демонстрируется перегрузка универсального метода Sort<T>(T[]) и перегрузка универсального метода BinarySearch<T>(T[], T). Массив строк создается без определенного порядка.

Массив отображается, сортируется и отображается снова.

Примечание

Вызовы Sort и BinarySearch универсальных методов не отличаются от вызовов к их негенерическим аналогам, так как Visual Basic, C#и C++ выводят тип параметра универсального типа из типа первого аргумента. Если вы используете Ildasm.exe (IL Disassembler) для изучения промежуточного языка Майкрософт (MSIL), можно увидеть, что вызываются универсальные методы.

Затем для поиска двух строк используется перегрузка универсального метода BinarySearch<T>(T[], T), которая не находится в массиве, а другая. Массив и возвращаемое значение метода BinarySearch передаются в универсальный метод ShowWhere, который отображает значение индекса, если строка найдена, и в противном случае элементы строки поиска будут падать между элементами, если они находились в массиве. Индекс отрицательный, если строка не n массива, поэтому метод ShowWhere принимает побитовое дополнение (оператор ~ в C# и Visual C++, Xor -1 в Visual Basic), чтобы получить индекс первого элемента в списке, который больше строки поиска.

using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {"Pachycephalosaurus",
                              "Amargasaurus",
                              "Tyrannosaurus",
                              "Mamenchisaurus",
                              "Deinonychus",
                              "Edmontosaurus"};

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

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

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

        Console.WriteLine("\nBinarySearch for 'Coelophysis':");
        int index = Array.BinarySearch(dinosaurs, "Coelophysis");
        ShowWhere(dinosaurs, index);

        Console.WriteLine("\nBinarySearch for 'Tyrannosaurus':");
        index = Array.BinarySearch(dinosaurs, "Tyrannosaurus");
        ShowWhere(dinosaurs, index);
    }

    private static void ShowWhere<T>(T[] array, int index)
    {
        if (index<0)
        {
            // If the index is negative, it represents the bitwise
            // complement of the next larger element in the array.
            //
            index = ~index;

            Console.Write("Not found. Sorts between: ");

            if (index == 0)
                Console.Write("beginning of array and ");
            else
                Console.Write("{0} and ", array[index-1]);

            if (index == array.Length)
                Console.WriteLine("end of array.");
            else
                Console.WriteLine("{0}.", array[index]);
        }
        else
        {
            Console.WriteLine("Found at index {0}.", index);
        }
    }
}

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Tyrannosaurus
Mamenchisaurus
Deinonychus
Edmontosaurus

Sort

Amargasaurus
Deinonychus
Edmontosaurus
Mamenchisaurus
Pachycephalosaurus
Tyrannosaurus

BinarySearch for 'Coelophysis':
Not found. Sorts between: Amargasaurus and Deinonychus.

BinarySearch for 'Tyrannosaurus':
Found at index 5.
 */

Комментарии

Каждый элемент array должен реализовать универсальный интерфейс IComparable<T>, чтобы он был способен сравниваться с каждым другим элементом в array.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengtharray.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<T>(T[], IComparer<T>)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы в Array с помощью указанного IComparer<T> универсального интерфейса.

public static void Sort<T> (T[] array, System.Collections.Generic.IComparer<T> comparer);
public static void Sort<T> (T[] array, System.Collections.Generic.IComparer<T>? comparer);

Параметры типа

T

Тип элементов массива.

Параметры

array
T[]

Одномерный, нулевой базовый Array для сортировки.

comparer
IComparer<T>

Реализация универсального интерфейса IComparer<T>, используемая при сравнении элементов или null для использования IComparable<T> реализации универсального интерфейса каждого элемента.

Исключения

array null.

comparer null, а один или несколько элементов в array не реализуют универсальный интерфейс IComparable<T>.

Реализация comparer вызвала ошибку во время сортировки. Например, comparer может не возвращать значение 0 при сравнении элемента с самим собой.

Примеры

В следующем примере кода демонстрируется перегрузка универсального метода Sort<T>(T[], IComparer<T>) и перегрузка универсального метода BinarySearch<T>(T[], T, IComparer<T>).

В примере кода определяется альтернативный средство сравнения строк с именем ReverseCompare, реализующее универсальный интерфейс IComparer<string> (IComparer(Of String) в Visual Basic, IComparer<String^> в Visual C++). Средство сравнения вызывает метод CompareTo(String), возвращая порядок сравнения таким образом, чтобы строки сортируются высоко к низкому, а не низкому.

Массив отображается, сортируется и отображается снова. Для использования метода BinarySearch необходимо отсортировать массивы.

Примечание

Вызовы Sort<T>(T[], IComparer<T>) и BinarySearch<T>(T[], T, IComparer<T>) универсальных методов не отличаются от вызовов к их негенерическим аналогам, так как Visual Basic, C#и C++ выводят тип параметра универсального типа из типа первого аргумента. Если вы используете Ildasm.exe (IL Disassembler) для изучения промежуточного языка Майкрософт (MSIL), можно увидеть, что вызываются универсальные методы.

Затем для поиска двух строк используется перегрузка универсального метода BinarySearch<T>(T[], T, IComparer<T>), которая не находится в массиве, а другая. Массив и возвращаемое значение метода BinarySearch<T>(T[], T, IComparer<T>) передаются в универсальный метод ShowWhere, который отображает значение индекса, если строка найдена, и в противном случае элементы строки поиска будут падать между элементами, если они находились в массиве. Индекс отрицательный, если строка не n массива, поэтому метод ShowWhere принимает побитовое дополнение (оператор ~ в C# и Visual C++, Xor -1 в Visual Basic), чтобы получить индекс первого элемента в списке, который больше строки поиска.

using System;
using System.Collections.Generic;

public class ReverseComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Compare y and x in reverse order.
        return y.CompareTo(x);
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {"Pachycephalosaurus",
                              "Amargasaurus",
                              "Tyrannosaurus",
                              "Mamenchisaurus",
                              "Deinonychus",
                              "Edmontosaurus"};

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

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort");
        Array.Sort(dinosaurs, rc);

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

        Console.WriteLine("\nBinarySearch for 'Coelophysis':");
        int index = Array.BinarySearch(dinosaurs, "Coelophysis", rc);
        ShowWhere(dinosaurs, index);

        Console.WriteLine("\nBinarySearch for 'Tyrannosaurus':");
        index = Array.BinarySearch(dinosaurs, "Tyrannosaurus", rc);
        ShowWhere(dinosaurs, index);
    }

    private static void ShowWhere<T>(T[] array, int index)
    {
        if (index<0)
        {
            // If the index is negative, it represents the bitwise
            // complement of the next larger element in the array.
            //
            index = ~index;

            Console.Write("Not found. Sorts between: ");

            if (index == 0)
                Console.Write("beginning of array and ");
            else
                Console.Write("{0} and ", array[index-1]);

            if (index == array.Length)
                Console.WriteLine("end of array.");
            else
                Console.WriteLine("{0}.", array[index]);
        }
        else
        {
            Console.WriteLine("Found at index {0}.", index);
        }
    }
}

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Tyrannosaurus
Mamenchisaurus
Deinonychus
Edmontosaurus

Sort

Tyrannosaurus
Pachycephalosaurus
Mamenchisaurus
Edmontosaurus
Deinonychus
Amargasaurus

BinarySearch for 'Coelophysis':
Not found. Sorts between: Deinonychus and Amargasaurus.

BinarySearch for 'Tyrannosaurus':
Found at index 0.
 */

Комментарии

Если comparernull, каждый элемент array должен реализовать универсальный интерфейс IComparable<T> для сравнения с каждым другим элементом в array.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengtharray.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 16 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<T>(T[], Comparison<T>)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы в Array с помощью указанного Comparison<T>.

public static void Sort<T> (T[] array, Comparison<T> comparison);

Параметры типа

T

Тип элементов массива.

Параметры

array
T[]

Одномерный отсчитываемый от нуля Array сортировки.

comparison
Comparison<T>

Comparison<T>, используемый при сравнении элементов.

Исключения

array null.

-или-

comparison null.

Реализация comparison вызвала ошибку во время сортировки. Например, comparison может не возвращать значение 0 при сравнении элемента с самим собой.

Примеры

В следующем примере кода демонстрируется перегрузка метода Sort(Comparison<T>).

В примере кода определяется альтернативный метод сравнения строк с именем CompareDinosByLength. Этот метод работает следующим образом: во-первых, сравнения проверяются дляnull, а ссылка null обрабатывается как меньше, чем значение NULL. Во-вторых, длина строки сравнивается, а длинная строка считается большей. В-третьих, если длина равна, используется обычное сравнение строк.

Массив строк создается и заполняется четырьмя строками без определенного порядка. Список также содержит пустую строку и ссылку null. Список отображается, отсортирован с помощью Comparison<T> универсального делегата, представляющего метод CompareDinosByLength, и отображается снова.

using System;
using System.Collections.Generic;

public class Example
{
    private static int CompareDinosByLength(string x, string y)
    {
        if (x == null)
        {
            if (y == null)
            {
                // If x is null and y is null, they're
                // equal.
                return 0;
            }
            else
            {
                // If x is null and y is not null, y
                // is greater.
                return -1;
            }
        }
        else
        {
            // If x is not null...
            //
            if (y == null)
                // ...and y is null, x is greater.
            {
                return 1;
            }
            else
            {
                // ...and y is not null, compare the
                // lengths of the two strings.
                //
                int retval = x.Length.CompareTo(y.Length);

                if (retval != 0)
                {
                    // If the strings are not of equal length,
                    // the longer string is greater.
                    //
                    return retval;
                }
                else
                {
                    // If the strings are of equal length,
                    // sort them with ordinary string comparison.
                    //
                    return x.CompareTo(y);
                }
            }
        }
    }

    public static void Main()
    {
        string[] dinosaurs = {
            "Pachycephalosaurus",
            "Amargasaurus",
            "",
            null,
            "Mamenchisaurus",
            "Deinonychus" };
        Display(dinosaurs);

        Console.WriteLine("\nSort with generic Comparison<string> delegate:");
        Array.Sort(dinosaurs, CompareDinosByLength);
        Display(dinosaurs);
    }

    private static void Display(string[] arr)
    {
        Console.WriteLine();
        foreach( string s in arr )
        {
            if (s == null)
                Console.WriteLine("(null)");
            else
                Console.WriteLine("\"{0}\"", s);
        }
    }
}

/* This code example produces the following output:

"Pachycephalosaurus"
"Amargasaurus"
""
(null)
"Mamenchisaurus"
"Deinonychus"

Sort with generic Comparison<string> delegate:

(null)
""
"Deinonychus"
"Amargasaurus"
"Mamenchisaurus"
"Pachycephalosaurus"
 */

Комментарии

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм introspective (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengtharray.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 6 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<T>(T[], Int32, Int32)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы в диапазоне элементов в Array с помощью IComparable<T> реализации универсального интерфейса каждого элемента Array.

public static void Sort<T> (T[] array, int index, int length);

Параметры типа

T

Тип элементов массива.

Параметры

array
T[]

Одномерный отсчитываемый от нуля Array сортировки.

index
Int32

Начальный индекс диапазона для сортировки.

length
Int32

Количество элементов в диапазоне для сортировки.

Исключения

array null.

index меньше нижней границы array.

-или-

length меньше нуля.

index и length не указывают допустимый диапазон в array.

Один или несколько элементов в array не реализуют универсальный интерфейс IComparable<T>.

Примеры

В следующем примере кода демонстрируется перегрузка универсального метода Sort<T>(T[], Int32, Int32) и перегрузка универсального метода Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) для сортировки диапазона в массиве.

В примере кода определяется альтернативный средство сравнения строк с именем ReverseCompare, реализующее универсальный интерфейс IComparer<string> (IComparer(Of String) в Visual Basic, IComparer<String^> в Visual C++). Средство сравнения вызывает метод CompareTo(String), возвращая порядок сравнения таким образом, чтобы строки сортируются высоко к низкому, а не низкому.

В примере кода создается и отображается массив имен динозавров, состоящий из трех травоядных, за которыми следует три плотоядных (тираннозауриды, чтобы быть точным). Перегрузка универсального метода Sort<T>(T[], Int32, Int32) используется для сортировки последних трех элементов массива, который затем отображается. Перегрузка универсального метода Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) используется ReverseCompare для сортировки последних трех элементов в обратном порядке. Тщательно запутанные динозавры отображаются снова.

Примечание

Вызовы Sort<T>(T[], IComparer<T>) и BinarySearch<T>(T[], T, IComparer<T>) универсальных методов не отличаются от вызовов к их негенерическим аналогам, так как Visual Basic, C#и C++ выводят тип параметра универсального типа из типа первого аргумента. Если вы используете Ildasm.exe (IL Disassembler) для изучения промежуточного языка Майкрософт (MSIL), можно увидеть, что вызываются универсальные методы.

using System;
using System.Collections.Generic;

public class ReverseComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Compare y and x in reverse order.
        return y.CompareTo(x);
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {"Pachycephalosaurus",
                              "Amargasaurus",
                              "Mamenchisaurus",
                              "Tarbosaurus",
                              "Tyrannosaurus",
                              "Albertasaurus"};

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

        Console.WriteLine("\nSort(dinosaurs, 3, 3)");
        Array.Sort(dinosaurs, 3, 3);

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

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort(dinosaurs, 3, 3, rc)");
        Array.Sort(dinosaurs, 3, 3, rc);

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

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Tarbosaurus
Tyrannosaurus
Albertasaurus

Sort(dinosaurs, 3, 3)

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Albertasaurus
Tarbosaurus
Tyrannosaurus

Sort(dinosaurs, 3, 3, rc)

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Tyrannosaurus
Tarbosaurus
Albertasaurus
 */

Комментарии

Каждый элемент в заданном диапазоне элементов в array должен реализовывать универсальный интерфейс IComparable<T>, чтобы быть способным сравниваться с каждым другим элементом в array.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n), где nlength.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<T>(T[], Int32, Int32, IComparer<T>)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует элементы в диапазоне элементов в Array с помощью указанного IComparer<T> универсального интерфейса.

public static void Sort<T> (T[] array, int index, int length, System.Collections.Generic.IComparer<T> comparer);
public static void Sort<T> (T[] array, int index, int length, System.Collections.Generic.IComparer<T>? comparer);

Параметры типа

T

Тип элементов массива.

Параметры

array
T[]

Одномерный отсчитываемый от нуля Array сортировки.

index
Int32

Начальный индекс диапазона для сортировки.

length
Int32

Количество элементов в диапазоне для сортировки.

comparer
IComparer<T>

Реализация универсального интерфейса IComparer<T>, используемая при сравнении элементов или null для использования IComparable<T> реализации универсального интерфейса каждого элемента.

Исключения

array null.

index меньше нижней границы array.

-или-

length меньше нуля.

index и length не указывают допустимый диапазон в array.

-или-

Реализация comparer вызвала ошибку во время сортировки. Например, comparer может не возвращать значение 0 при сравнении элемента с самим собой.

comparer null, а один или несколько элементов в array не реализуют универсальный интерфейс IComparable<T>.

Примеры

В следующем примере кода демонстрируется перегрузка универсального метода Sort<T>(T[], Int32, Int32) и перегрузка универсального метода Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) для сортировки диапазона в массиве.

В примере кода определяется альтернативный средство сравнения строк с именем ReverseCompare, реализующее универсальный интерфейс IComparer<string> (IComparer(Of String) в Visual Basic, IComparer<String^> в Visual C++). Средство сравнения вызывает метод CompareTo(String), возвращая порядок сравнения таким образом, чтобы строки сортируются высоко к низкому, а не низкому.

В примере кода создается и отображается массив имен динозавров, состоящий из трех травоядных, за которыми следует три плотоядных (тираннозауриды, чтобы быть точным). Перегрузка универсального метода Sort<T>(T[], Int32, Int32) используется для сортировки последних трех элементов массива, который затем отображается. Перегрузка универсального метода Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) используется ReverseCompare для сортировки последних трех элементов в обратном порядке. Тщательно запутанные динозавры отображаются снова.

Примечание

Вызовы Sort<T>(T[], IComparer<T>) и BinarySearch<T>(T[], T, IComparer<T>) универсальных методов не отличаются от вызовов к их негенерическим аналогам, так как Visual Basic, C#и C++ выводят тип параметра универсального типа из типа первого аргумента. Если вы используете Ildasm.exe (IL Disassembler) для изучения промежуточного языка Майкрософт (MSIL), можно увидеть, что вызываются универсальные методы.

using System;
using System.Collections.Generic;

public class ReverseComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Compare y and x in reverse order.
        return y.CompareTo(x);
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {"Pachycephalosaurus",
                              "Amargasaurus",
                              "Mamenchisaurus",
                              "Tarbosaurus",
                              "Tyrannosaurus",
                              "Albertasaurus"};

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

        Console.WriteLine("\nSort(dinosaurs, 3, 3)");
        Array.Sort(dinosaurs, 3, 3);

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

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort(dinosaurs, 3, 3, rc)");
        Array.Sort(dinosaurs, 3, 3, rc);

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

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Tarbosaurus
Tyrannosaurus
Albertasaurus

Sort(dinosaurs, 3, 3)

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Albertasaurus
Tarbosaurus
Tyrannosaurus

Sort(dinosaurs, 3, 3, rc)

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Tyrannosaurus
Tarbosaurus
Albertasaurus
 */

Комментарии

Если comparernull, каждый элемент в заданном диапазоне элементов в array должен реализовать универсальный интерфейс IComparable<T>, чтобы иметь возможность сравнения с каждым другим элементом в array.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n), где nlength.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 16 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует диапазон элементов в паре объектов Array (один содержит ключи и другой содержит соответствующие элементы) на основе ключей в первой Array с помощью указанного IComparer<T> универсального интерфейса.

public static void Sort<TKey,TValue> (TKey[] keys, TValue[] items, int index, int length, System.Collections.Generic.IComparer<TKey> comparer);
public static void Sort<TKey,TValue> (TKey[] keys, TValue[]? items, int index, int length, System.Collections.Generic.IComparer<TKey>? comparer);

Параметры типа

TKey

Тип элементов массива ключей.

TValue

Тип элементов массива элементов.

Параметры

keys
TKey[]

Одномерный отсчитываемый от нуля Array, содержащий ключи для сортировки.

items
TValue[]

Одномерный отсчитываемый от нуля Array, содержащий элементы, соответствующие ключам в keys, или null для сортировки только keys.

index
Int32

Начальный индекс диапазона для сортировки.

length
Int32

Количество элементов в диапазоне для сортировки.

comparer
IComparer<TKey>

Реализация универсального интерфейса IComparer<T>, используемая при сравнении элементов или null для использования IComparable<T> реализации универсального интерфейса каждого элемента.

Исключения

index меньше нижней границы keys.

-или-

length меньше нуля.

items не null, а нижняя граница keys не соответствует нижней границе items.

-или-

items не null, а длина keys больше длины items.

-или-

index и length не указывают допустимый диапазон в keysArray.

-или-

items не null, а index и length не указывают допустимый диапазон в itemsArray.

-или-

Реализация comparer вызвала ошибку во время сортировки. Например, comparer может не возвращать значение 0 при сравнении элемента с самим собой.

comparer null, а один или несколько элементов в keysArray не реализуют универсальный интерфейс IComparable<T>.

Примеры

В следующем примере кода демонстрируется Sort<TKey,TValue>(TKey[], TValue[]), Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>), Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)и Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) перегрузки универсальных методов для сортировки пар массивов, представляющих ключи и значения.

В примере кода определяется альтернативный средство сравнения строк с именем ReverseCompare, реализующее универсальный интерфейс IComparer<string>(IComparer(Of String) в Visual Basic, IComparer<String^> в Visual C++). Средство сравнения вызывает метод CompareTo(String), возвращая порядок сравнения таким образом, чтобы строки сортируются высоко к низкому, а не низкому.

В примере кода создается и отображается массив имен динозавров (ключи) и массив целых чисел, представляющих максимальную длину каждого динозавра в метрах (значения). Затем массивы сортируются и отображаются несколько раз:

Примечание

Вызовы универсальных методов не отличаются от вызовов к их негенерическим аналогам, так как Visual Basic, C#и C++ выводят тип параметра универсального типа из типа первых двух аргументов. Если вы используете Ildasm.exe (IL Disassembler) для изучения промежуточного языка Майкрософт (MSIL), можно увидеть, что вызываются универсальные методы.

using System;
using System.Collections.Generic;

public class ReverseComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Compare y and x in reverse order.
        return y.CompareTo(x);
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {
            "Seismosaurus",
            "Chasmosaurus",
            "Coelophysis",
            "Mamenchisaurus",
            "Caudipteryx",
            "Cetiosaurus"  };

        int[] dinosaurSizes = { 40, 5, 3, 22, 1, 18 };

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes)");
        Array.Sort(dinosaurs, dinosaurSizes);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, rc)");
        Array.Sort(dinosaurs, dinosaurSizes, rc);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, 3, 3)");
        Array.Sort(dinosaurs, dinosaurSizes, 3, 3);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)");
        Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }
    }
}

/* This code example produces the following output:

Seismosaurus: up to 40 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.

Sort(dinosaurs, dinosaurSizes)

Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Seismosaurus: up to 40 meters long.

Sort(dinosaurs, dinosaurSizes, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.
 */

Комментарии

Каждый ключ в keysArray имеет соответствующий элемент в itemsArray. При перепозиции ключа во время сортировки соответствующий элемент в itemsArray изменяется аналогично. Поэтому itemsArray сортируется в соответствии с расположением соответствующих ключей в keysArray.

Если comparernull, каждый ключ в указанном диапазоне элементов в keysArray должен реализовать универсальный интерфейс IComparable<T>, чтобы иметь возможность сравнения с каждым другим ключом.

Можно сортировать, если есть больше элементов, чем ключи, но элементы, у которых нет соответствующих ключей, не будут отсортированы. Невозможно отсортировать, если есть больше ключей, чем элементы; при этом возникает ArgumentException.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n), где nlength.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 16 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<TKey,TValue>(TKey[], TValue[])

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует пару объектов Array (один содержит ключи, а другой содержит соответствующие элементы) на основе ключей в первой Array с помощью IComparable<T> реализации универсального интерфейса каждого ключа.

public static void Sort<TKey,TValue> (TKey[] keys, TValue[] items);
public static void Sort<TKey,TValue> (TKey[] keys, TValue[]? items);

Параметры типа

TKey

Тип элементов массива ключей.

TValue

Тип элементов массива элементов.

Параметры

keys
TKey[]

Одномерный отсчитываемый от нуля Array, содержащий ключи для сортировки.

items
TValue[]

Одномерный отсчитываемый от нуля Array, содержащий элементы, соответствующие ключам в keys, или null для сортировки только keys.

Исключения

items не null, а нижняя граница keys не соответствует нижней границе items.

-или-

items не null, а длина keys больше длины items.

Один или несколько элементов в keysArray не реализуют универсальный интерфейс IComparable<T>.

Примеры

В следующем примере кода демонстрируется Sort<TKey,TValue>(TKey[], TValue[]), Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>), Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)и Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) перегрузки универсальных методов для сортировки пар массивов, представляющих ключи и значения.

В примере кода определяется альтернативный средство сравнения строк с именем ReverseCompare, реализующее универсальный интерфейс IComparer<string> (IComparer(Of String) в Visual Basic, IComparer<String^> в Visual C++). Средство сравнения вызывает метод CompareTo(String), возвращая порядок сравнения таким образом, чтобы строки сортируются высоко к низкому, а не низкому.

В примере кода создается и отображается массив имен динозавров (ключи) и массив целых чисел, представляющих максимальную длину каждого динозавра в метрах (значения). Затем массивы сортируются и отображаются несколько раз:

Примечание

Вызовы универсальных методов не отличаются от вызовов к их негенерическим аналогам, так как Visual Basic, C#и C++ выводят тип параметра универсального типа из типа первых двух аргументов. Если вы используете Ildasm.exe (IL Disassembler) для изучения промежуточного языка Майкрософт (MSIL), можно увидеть, что вызываются универсальные методы.

using System;
using System.Collections.Generic;

public class ReverseComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Compare y and x in reverse order.
        return y.CompareTo(x);
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {
            "Seismosaurus",
            "Chasmosaurus",
            "Coelophysis",
            "Mamenchisaurus",
            "Caudipteryx",
            "Cetiosaurus"  };

        int[] dinosaurSizes = { 40, 5, 3, 22, 1, 18 };

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes)");
        Array.Sort(dinosaurs, dinosaurSizes);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, rc)");
        Array.Sort(dinosaurs, dinosaurSizes, rc);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, 3, 3)");
        Array.Sort(dinosaurs, dinosaurSizes, 3, 3);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)");
        Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }
    }
}

/* This code example produces the following output:

Seismosaurus: up to 40 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.

Sort(dinosaurs, dinosaurSizes)

Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Seismosaurus: up to 40 meters long.

Sort(dinosaurs, dinosaurSizes, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.
 */

Комментарии

Каждый ключ в keysArray имеет соответствующий элемент в itemsArray. При перепозиции ключа во время сортировки соответствующий элемент в itemsArray изменяется аналогично. Поэтому itemsArray сортируется в соответствии с расположением соответствующих ключей в keysArray.

Каждый ключ в keysArray должен реализовать универсальный интерфейс IComparable<T>, чтобы иметь возможность сравнения с каждым другим ключом.

Можно сортировать, если есть больше элементов, чем ключи, но элементы, у которых нет соответствующих ключей, не будут отсортированы. Невозможно отсортировать, если есть больше ключей, чем элементы; при этом возникает ArgumentException.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengtharray.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует пару объектов Array (один содержит ключи, а другой содержит соответствующие элементы) на основе ключей в первой Array с помощью указанного IComparer<T> универсального интерфейса.

public static void Sort<TKey,TValue> (TKey[] keys, TValue[] items, System.Collections.Generic.IComparer<TKey> comparer);
public static void Sort<TKey,TValue> (TKey[] keys, TValue[]? items, System.Collections.Generic.IComparer<TKey>? comparer);

Параметры типа

TKey

Тип элементов массива ключей.

TValue

Тип элементов массива элементов.

Параметры

keys
TKey[]

Одномерный отсчитываемый от нуля Array, содержащий ключи для сортировки.

items
TValue[]

Одномерный отсчитываемый от нуля Array, содержащий элементы, соответствующие ключам в keys, или null для сортировки только keys.

comparer
IComparer<TKey>

Реализация универсального интерфейса IComparer<T>, используемая при сравнении элементов или null для использования IComparable<T> реализации универсального интерфейса каждого элемента.

Исключения

items не null, а нижняя граница keys не соответствует нижней границе items.

-или-

items не null, а длина keys больше длины items.

-или-

Реализация comparer вызвала ошибку во время сортировки. Например, comparer может не возвращать значение 0 при сравнении элемента с самим собой.

comparer null, а один или несколько элементов в keysArray не реализуют универсальный интерфейс IComparable<T>.

Примеры

В следующем примере кода показаны Sort<TKey,TValue>(TKey[], TValue[]), [], Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>), Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)и Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) перегрузки универсальных методов для сортировки пар массивов, представляющих ключи и значения.

В примере кода определяется альтернативный средство сравнения строк с именем ReverseCompare, реализующее универсальный интерфейс IComparer<string> (IComparer(Of String) в Visual Basic, IComparer<String^> в Visual C++). Средство сравнения вызывает метод CompareTo(String), возвращая порядок сравнения таким образом, чтобы строки сортируются высоко к низкому, а не низкому.

В примере кода создается и отображается массив имен динозавров (ключи) и массив целых чисел, представляющих максимальную длину каждого динозавра в метрах (значения). Затем массивы сортируются и отображаются несколько раз:

Примечание

Вызовы универсальных методов не отличаются от вызовов к их негенерическим аналогам, так как Visual Basic, C#и C++ выводят тип параметра универсального типа из типа первых двух аргументов. Если вы используете Ildasm.exe (IL Disassembler) для изучения промежуточного языка Майкрософт (MSIL), можно увидеть, что вызываются универсальные методы.

using System;
using System.Collections.Generic;

public class ReverseComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Compare y and x in reverse order.
        return y.CompareTo(x);
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {
            "Seismosaurus",
            "Chasmosaurus",
            "Coelophysis",
            "Mamenchisaurus",
            "Caudipteryx",
            "Cetiosaurus"  };

        int[] dinosaurSizes = { 40, 5, 3, 22, 1, 18 };

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes)");
        Array.Sort(dinosaurs, dinosaurSizes);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, rc)");
        Array.Sort(dinosaurs, dinosaurSizes, rc);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, 3, 3)");
        Array.Sort(dinosaurs, dinosaurSizes, 3, 3);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)");
        Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }
    }
}

/* This code example produces the following output:

Seismosaurus: up to 40 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.

Sort(dinosaurs, dinosaurSizes)

Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Seismosaurus: up to 40 meters long.

Sort(dinosaurs, dinosaurSizes, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.
 */

Комментарии

Каждый ключ в keysArray имеет соответствующий элемент в itemsArray. При перепозиции ключа во время сортировки соответствующий элемент в itemsArray изменяется аналогично. Поэтому itemsArray сортируется в соответствии с расположением соответствующих ключей в keysArray.

Если comparernull, каждый ключ в keysArray должен реализовать универсальный интерфейс IComparable<T> для сравнения с каждым другим ключом.

Можно сортировать, если есть больше элементов, чем ключи, но элементы, у которых нет соответствующих ключей, не будут отсортированы. Невозможно отсортировать, если есть больше ключей, чем элементы; при этом возникает ArgumentException.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n ), где n является Lengtharray.

Примечания для тех, кто вызывает этот метод

.NET Framework 4 и более ранние версии использовали только алгоритм Quicksort. Quicksort определяет недопустимые компраторы в некоторых ситуациях, в которых операция сортировки создает исключение IndexOutOfRangeException и вызывает исключение ArgumentException вызывающей стороны. Начиная с .NET Framework 4.5, возможно, что операции сортировки, которые ранее бросили ArgumentException, не будут вызывать исключение, так как алгоритмы сортировки вставки и кучи не обнаруживают недопустимого сравнения. В большинстве случаев это относится к массивам с меньшей или равной 16 элементам.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Сортирует диапазон элементов в паре объектов Array (один содержит ключи, а другой содержит соответствующие элементы) на основе ключей в первой Array с помощью реализации универсального интерфейса IComparable<T> каждого ключа.

public static void Sort<TKey,TValue> (TKey[] keys, TValue[] items, int index, int length);
public static void Sort<TKey,TValue> (TKey[] keys, TValue[]? items, int index, int length);

Параметры типа

TKey

Тип элементов массива ключей.

TValue

Тип элементов массива элементов.

Параметры

keys
TKey[]

Одномерный отсчитываемый от нуля Array, содержащий ключи для сортировки.

items
TValue[]

Одномерный отсчитываемый от нуля Array, содержащий элементы, соответствующие ключам в keys, или null для сортировки только keys.

index
Int32

Начальный индекс диапазона для сортировки.

length
Int32

Количество элементов в диапазоне для сортировки.

Исключения

index меньше нижней границы keys.

-или-

length меньше нуля.

items не null, а нижняя граница keys не соответствует нижней границе items.

-или-

items не null, а длина keys больше длины items.

-или-

index и length не указывают допустимый диапазон в keysArray.

-или-

items не null, а index и length не указывают допустимый диапазон в itemsArray.

Один или несколько элементов в keysArray не реализуют универсальный интерфейс IComparable<T>.

Примеры

В следующем примере кода демонстрируется Sort<TKey,TValue>(TKey[], TValue[]), Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>), Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)и Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) перегрузки универсальных методов для сортировки пар массивов, представляющих ключи и значения.

В примере кода определяется альтернативный средство сравнения строк с именем ReverseCompare, реализующее универсальный интерфейс IComparer<string> (IComparer(Of String) в Visual Basic, IComparer<String^> в Visual C++). Средство сравнения вызывает метод CompareTo(String), возвращая порядок сравнения таким образом, чтобы строки сортируются высоко к низкому, а не низкому.

В примере кода создается и отображается массив имен динозавров (ключи) и массив целых чисел, представляющих максимальную длину каждого динозавра в метрах (значения). Затем массивы сортируются и отображаются несколько раз:

Примечание

Вызовы универсальных методов не отличаются от вызовов к их негенерическим аналогам, так как Visual Basic, C#и C++ выводят тип параметра универсального типа из типа первых двух аргументов. Если вы используете Ildasm.exe (IL Disassembler) для изучения промежуточного языка Майкрософт (MSIL), можно увидеть, что вызываются универсальные методы.

using System;
using System.Collections.Generic;

public class ReverseComparer: IComparer<string>
{
    public int Compare(string x, string y)
    {
        // Compare y and x in reverse order.
        return y.CompareTo(x);
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs = {
            "Seismosaurus",
            "Chasmosaurus",
            "Coelophysis",
            "Mamenchisaurus",
            "Caudipteryx",
            "Cetiosaurus"  };

        int[] dinosaurSizes = { 40, 5, 3, 22, 1, 18 };

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes)");
        Array.Sort(dinosaurs, dinosaurSizes);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, rc)");
        Array.Sort(dinosaurs, dinosaurSizes, rc);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, 3, 3)");
        Array.Sort(dinosaurs, dinosaurSizes, 3, 3);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }

        Console.WriteLine("\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)");
        Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc);

        Console.WriteLine();
        for (int i = 0; i < dinosaurs.Length; i++)
        {
            Console.WriteLine("{0}: up to {1} meters long.",
                dinosaurs[i], dinosaurSizes[i]);
        }
    }
}

/* This code example produces the following output:

Seismosaurus: up to 40 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.

Sort(dinosaurs, dinosaurSizes)

Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.
Coelophysis: up to 3 meters long.
Mamenchisaurus: up to 22 meters long.
Seismosaurus: up to 40 meters long.

Sort(dinosaurs, dinosaurSizes, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Caudipteryx: up to 1 meters long.
Cetiosaurus: up to 18 meters long.
Chasmosaurus: up to 5 meters long.

Sort(dinosaurs, dinosaurSizes, 3, 3, rc)

Seismosaurus: up to 40 meters long.
Mamenchisaurus: up to 22 meters long.
Coelophysis: up to 3 meters long.
Chasmosaurus: up to 5 meters long.
Cetiosaurus: up to 18 meters long.
Caudipteryx: up to 1 meters long.
 */

Комментарии

Каждый ключ в keysArray имеет соответствующий элемент в itemsArray. При перепозиции ключа во время сортировки соответствующий элемент в itemsArray изменяется аналогично. Поэтому itemsArray сортируется в соответствии с расположением соответствующих ключей в keysArray.

Каждый ключ в указанном диапазоне элементов в keysArray должен реализовать универсальный интерфейс IComparable<T>, чтобы иметь возможность сравнения с каждым другим ключом.

Можно сортировать, если есть больше элементов, чем ключи, но элементы, у которых нет соответствующих ключей, не будут отсортированы. Невозможно отсортировать, если есть больше ключей, чем элементы; при этом возникает ArgumentException.

Если сортировка не выполнена успешно, результаты не определены.

Этот метод использует алгоритм интроспективной сортировки (introsort) следующим образом:

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

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

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

Эта реализация выполняет неустойчивую сортировку; То есть, если два элемента равны, их порядок может не сохраняться. В отличие от этого, стабильная сортировка сохраняет порядок элементов, равных.

Этот метод представляет собой операцию nжурнала O(n), где nlength.

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0