この記事の英語版を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語
このドキュメントはアーカイブされており、メンテナンスされていません。

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

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

名前空間:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

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

型パラメーター

TKey

キー用の配列要素の型。

TValue

項目用の配列要素の型。

パラメーター

keys
型: TKey[]
並べ替えるキーを格納している 1 次元の Array。インデックス番号が 0 から始まる必要があります。
items
型: TValue[]
keys 内のキーに対応する項目が格納された、インデックス番号が 0 から始まる 1 次元 Arraykeys だけを並べ替える場合は null
index
型: System.Int32
並べ替え対象の範囲の開始位置を示すインデックス。
length
型: System.Int32
並べ替え対象の範囲内にある要素の数。
comparer
型: System.Collections.Generic.IComparer<TKey>
要素を比較する際に使用する IComparer<T> ジェネリック インターフェイスの実装。各要素が実装する IComparable<T> ジェネリック インターフェイスを使用する場合は null

例外条件
ArgumentNullException

keysnull なので、

ArgumentOutOfRangeException

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

または

length が 0 未満です。

ArgumentException

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

または

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

または

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

または

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

または

comparer の実装によって並べ替え中にエラーが発生しました。 たとえば、comparer は項目を項目自身と比較する場合に 0 を返さない可能性があります。

InvalidOperationException

comparernull であり、keysArray 内の 1 つ以上の要素に IComparable<T> ジェネリック インターフェイスが実装されていません。

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

comparernull の場合、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) メソッドを呼び出して、文字列が小さい順ではなく大きい順になるように比較対象値の順序を反転します。

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

  • Sort<TKey, TValue>(TKey[], TValue[]) のオーバーロードを使用して、最初の配列の恐竜名の順序で両方の配列を並べ替えます。

  • Sort<TKey, TValue>(TKey[], TValue[], IComparer<TKey>) のオーバーロードおよび ReverseCompare のインスタンスを使用して、配列のペアの並べ替え順序を反転します。

  • Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32) のオーバーロードを使用して、両方の配列の最後の 3 つの要素を並べ替えます。

  • Sort<TKey, TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>) のオーバーロードを使用して、両方の配列の最後の 3 つの要素を逆順に並べ替えます。

メモメモ

ジェネリック メソッドへの呼び出しは、対応する非ジェネリック型への呼び出しと違いがないように見えます。これは、Visual Basic、C#、および C++ が最初の 2 つの引数の型からジェネリック型パラメーターの型を推論するからです。 Ildasm.exe (MSIL 逆アセンブラー) を使用して Microsoft Intermediate Language (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.
 */


.NET Framework

サポート対象: 4、3.5、3.0、2.0

.NET Framework Client Profile

サポート対象: 4、3.5 SP1

Windows 7, Windows Vista SP1 以降, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core はサポート対象外), Windows Server 2008 R2 (SP1 以降で Server Core をサポート), Windows Server 2003 SP2

.NET Framework では、各プラットフォームのすべてのバージョンはサポートしていません。 サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。
表示: