정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Array.Sort<TKey, TValue> 메서드 (TKey[], TValue[], Int32, Int32)

2013-12-13

각 키에서 구현하는 IComparable<T> 제네릭 인터페이스를 사용하여 첫 번째 Array에 있는 키를 기반으로 하는 한 쌍의 Array 개체(키를 포함하는 개체와 해당 항목을 포함하는 개체)의 요소 범위를 정렬합니다.

Namespace:  System
어셈블리:  mscorlib(mscorlib.dll)

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

형식 매개 변수

TKey

키 배열 요소의 형식입니다.

TValue

항목 배열 요소의 형식입니다.

매개 변수

keys
형식: TKey []
정렬할 키를 포함하는 1차원 Array(인덱스는 0부터 시작)입니다.
items
형식: TValue []
keys의 키에 해당하는 항목을 포함하는 1차원 Array(인덱스는 0부터 시작)이거나, keys만 정렬할 경우 null입니다.
index
형식: System.Int32
정렬할 범위의 시작 인덱스입니다.
length
형식: System.Int32
정렬할 범위에 있는 요소 수입니다.

예외조건
ArgumentNullException

keysnull인 경우

ArgumentOutOfRangeException

indexkeys의 하한보다 작은 경우

-또는-

length가 0보다 작은 경우

ArgumentException

itemsnull이 아니고 keys의 하한이 items의 하한과 일치하지 않는 경우

-또는-

itemsnull이 아니고 keys의 길이가 items의 길이보다 긴 경우

-또는-

indexlengthkeysArray에서 올바른 범위를 나타내지 않는 경우

-또는-

itemsnull이 아니고 indexlengthitemsArray에서 올바른 범위를 지정하지 않는 경우

InvalidOperationException

keysArray의 요소 중 하나 이상이 IComparable<T> 제네릭 인터페이스를 구현하지 않는 경우

keysArray의 각 키에 해당하는 항목이 itemsArray에 있습니다. 정렬하는 동안 키의 위치가 바뀌면 itemsArray의 해당 항목도 동시에 위치가 바뀝니다. 따라서 itemsArraykeysArray에 있는 해당 키의 배열에 따라 정렬됩니다.

다른 모든 키와 비교할 수 있도록 keysArray의 지정한 요소 범위에 있는 각 키에서 IComparable<T> 제네릭 인터페이스를 구현해야 합니다.

항목이 키보다 많은 경우 정렬할 수 있지만 해당하는 키가 없는 항목은 정렬되지 않습니다. 키가 항목보다 많을 경우 정렬할 수 없습니다. 이렇게 하면 ArgumentException이 발생됩니다.

정렬이 완료되지 않으면 결과가 정의되지 않습니다.

이 메서드는 QuickSort 알고리즘을 사용합니다. 이 구현에서는 불안정한 정렬을 수행합니다. 즉, 두 개의 같은 요소가 있을 경우 이들 요소의 순서가 유지되지 않을 수 있습니다. 이와 반대로 안정된 정렬은 동일한 요소의 순서를 그대로 유지합니다.

평균적으로 이 메서드는 O(n log n) 연산이며, 여기서 nlength입니다. 최악의 경우 이 메서드는 O(n ^ 2) 연산입니다.

다음 코드 예제에서는 키 및 값을 나타내는 배열 쌍을 정렬하기 위한 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>) 제네릭 메서드 오버로드를 보여 줍니다.

이 코드 예제에서는 IComparer<string>(Visual Basic의 경우 IComparer(Of String), Visual C++의 경우 IComparer<String^>) 제네릭 인터페이스를 구현하는 ReverseCompare라는 문자열의 대체 비교자를 정의합니다. 비교자는 CompareTo(String) 메서드를 호출하고 비교 대상의 순서를 반대로 바꾸어 문자열이 오름차순이 아니라 내림차순으로 정렬되도록 합니다.

이 코드 예제에서는 공룡 이름(키)의 배열과 각 공룡의 최대 길이(값)를 미터 단위로 나타내는 정수의 배열을 만들어 표시합니다. 그런 다음 배열을 여러 번 정렬하여 표시합니다.

참고참고:

Visual Basic, C# 및 C++에서는 처음 두 개의 인수 형식에서 제네릭 형식 매개 변수의 형식을 유추하기 때문에 제네릭 메서드 호출은 상응하는 제네릭이 아닌 메서드 호출과 다르게 보이지 않습니다.


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 Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      string[] dinosaurs = {
            "Seismosaurus", 
            "Chasmosaurus", 
            "Coelophysis", 
            "Mamenchisaurus", 
            "Caudipteryx", 
            "Cetiosaurus"  };

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

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }

      outputBlock.Text += String.Format("\nSort(dinosaurs, dinosaurSizes)") + "\n";
      Array.Sort(dinosaurs, dinosaurSizes);

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }

      ReverseComparer rc = new ReverseComparer();

      outputBlock.Text += String.Format("\nSort(dinosaurs, dinosaurSizes, rc)") + "\n";
      Array.Sort(dinosaurs, dinosaurSizes, rc);

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }

      outputBlock.Text += String.Format("\nSort(dinosaurs, dinosaurSizes, 3, 3)") + "\n";
      Array.Sort(dinosaurs, dinosaurSizes, 3, 3);

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }

      outputBlock.Text += String.Format("\nSort(dinosaurs, dinosaurSizes, 3, 3, rc)") + "\n";
      Array.Sort(dinosaurs, dinosaurSizes, 3, 3, rc);

      outputBlock.Text += "\n";
      for (int i = 0; i < dinosaurs.Length; i++)
      {
         outputBlock.Text += String.Format("{0}: up to {1} meters long.",
             dinosaurs[i], dinosaurSizes[i]) + "\n";
      }
   }
}

/* 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.
 */


Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

표시: