C#は、配列をソートするための堅牢で汎用性の高いメソッドを提供します。このガイドでは、単純な整数配列から複雑なオブジェクト配列まで、さまざまなシナリオを説明し、C#のソート機能の能力と柔軟性を示します。
目次
Array.Sort() の理解
Array.Sort()
メソッドは、C#における配列ソートの基礎です。さまざまなデータ型とソート要件を処理するための複数のオーバーロードを提供します。主にクイックソートアルゴリズムを採用し、配列をインプレースで効率的にソートし、コピーを作成せずに元の配列を直接変更します。
int[] numbers = { 5, 2, 8, 1, 9, 4 };
Array.Sort(numbers); // 昇順
Console.WriteLine(string.Join(", ", numbers)); // 出力: 1, 2, 4, 5, 8, 9
この基本的な例では、整数配列でArray.Sort()
を示しています。配列はインプレースで昇順にソートされます。
文字列配列のソート
文字列配列のソートも同様に簡単です。Array.Sort()
は、デフォルトで辞書式(アルファベット順)の順序になります。
string[] names = { "David", "Alice", "Charlie", "Bob" };
Array.Sort(names);
Console.WriteLine(string.Join(", ", names)); // 出力: Alice, Bob, Charlie, David
カスタム比較
より細かい制御を行うには、デリゲートまたはラムダ式を使用したカスタム比較が非常に役立ちます。これは、特定のプロパティに基づいてオブジェクトをソートする場合や、標準以外の順序を使用する場合に不可欠です。
int[] numbers = { 5, 2, 8, 1, 9, 4 };
Array.Sort(numbers, (x, y) => y.CompareTo(x)); // 降順
Console.WriteLine(string.Join(", ", numbers)); // 出力: 9, 8, 5, 4, 2, 1
ラムダ式(x, y) => y.CompareTo(x)
は比較を反転させるため、降順になります。
オブジェクト配列のソート
オブジェクト配列をソートするには、ソートするプロパティを指定する必要があります。カスタム比較が不可欠です。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person[] people = {
new Person { Name = "Bob", Age = 30 },
new Person { Name = "Alice", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
Array.Sort(people, (x, y) => x.Age.CompareTo(y.Age)); // 年齢でソート
foreach (var person in people)
{
Console.WriteLine($"{person.Name} - {person.Age}");
}
ソートのためのLINQ
より複雑なシナリオの場合、またはList<T>
を使用する場合、LINQは強力なソート機能を提供します。OrderBy()
とOrderByDescending()
は、カスタムコンパレータを使用した柔軟なソートを提供します。
List<Person> peopleList = people.ToList();
var sortedPeopleByName = peopleList.OrderBy(p => p.Name);
foreach (var person in sortedPeopleByName)
{
Console.WriteLine($"{person.Name} - {person.Age}");
}
パフォーマンスの考慮事項
Array.Sort()
は一般的に効率的ですが、非常に大きな配列を扱う場合は、データサイズと比較の複雑さを考慮する必要があります。大規模なデータセットの場合、特殊なソートアルゴリズムや並列処理技術を検討すると、パフォーマンスが向上する可能性があります。
結論
C#の配列ソートメカニズムは、さまざまなデータ型とソートニーズに対して非常に効果的です。カスタム比較を習得し、適切な場合にLINQを活用することで、アプリケーションにおける効率的で柔軟なソートが保証されます。
FAQ
- Q:
Array.Sort()
は安定していますか? A: はい、安定ソートです。等しい要素の相対的な順序は保持されます。 - Q:
Array.Sort()
は何アルゴリズムを使用していますか? A: 通常、クイックソートまたはイントロスペクティブソートのバリアントを使用し、データに基づいて最も効率的なアルゴリズムを動的に選択します。 - Q:
List<T>
をソートするにはどうすればよいですか? A:List<T>.Sort()
またはLINQのOrderBy()
/OrderByDescending()
メソッドを使用します。