情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Array.Sort<TKey, TValue> メソッド (TKey[], TValue[], Int32, Int32)

2013/12/12

2 つの Array オブジェクト (一方のオブジェクトがキーを格納し、他方のオブジェクトがそれらに対応する項目を格納する) の要素範囲を、最初の Array 内のキーに基づき、各キーによって実装された IComparable<T> ジェネリック インターフェイスを使用して並べ替えます。

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 次元の 0 から始まる Arraykeys のみを並び替える場合は null
index
型: System.Int32
並べ替える範囲の開始インデックス。
length
型: System.Int32
並べ替える範囲の要素数。

例外条件
ArgumentNullException

keysnull です。

ArgumentOutOfRangeException

indexkeys の下限より小さい値です。

または

length が 0 未満です。

ArgumentException

itemsnull ではなく、keys の下限が items の下限と一致していません。

または

itemsnull ではなく、keys の長さが items の長さを超えています。

または

index および lengthkeysArray 内の有効な範囲を指定していません。

または

itemsnull ではなく、index および lengthitemsArray 内の有効な範囲を示していません。

InvalidOperationException

keysArray の 1 つ以上の要素が IComparable<T> 汎用インターフェイスを実装していません。

keysArray 内の各キーには、itemsArray 内に対応する項目があります。並べ替え時にキーの場所が変更されると、itemsArray 内の対応する項目の場所も同様に変更されます。したがって、itemsArray は、keysArray の対応するキーの配置に基づいて並べ替えられます。

keysArray の指定した要素範囲内の各キーは、他のすべてのキーと比較できるように、IComparable<T> ジェネリック インターフェイスを実装する必要があります。

項目がキーより多い場合は並べ替えることができますが、対応するキーのない項目は並べ替えられません。キーが項目より多い場合、並べ替えることはできません。並べ替えると、ArgumentException がスローされます。

並べ替えが正常に完了しなかった場合、結果は未定義になります。

このメソッドは、QuickSort アルゴリズムを使用します。この実装では不安定な並べ替えを実行します。つまり、2 つの要素が等しかった場合、これらの順序は保持されない可能性があります。一方、安定した並べ替えの場合には、等しい要素の順序が保たれます。

平均して、このメソッドは 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>) の各ジェネリック メソッド オーバーロードを使用して、キーと値を表す配列のペアを並べ替えるコード例を次に示します。

コード例では、ReverseCompare という名前の文字列に対して、IComparer<string> (Visual Basic では IComparer(Of String)、Visual C++ では IComparer<String^>) ジェネリック インターフェイスを実装する代替の比較子を定義します。比較子は、CompareTo(String) メソッドを呼び出して、文字列が小さい順ではなく大きい順になるように比較対象値の順序を反転します。

コード例では、恐竜名 (キー) と、各恐竜の最大長をメートル単位で表す整数の配列 (値) を作成して表示します。配列は複数回並べ替えられて、表示されます。

メモメモ:

ジェネリック メソッドへの呼び出しは、対応する非ジェネリック型への呼び出しと違いがないように見えます。これは、Visual Basic、C#、および C++ が最初の 2 つの引数の型からジェネリック型パラメーターの型を推論するためです。


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

表示: