配列のソートはプログラミングにおける基本的な操作です。C#は、降順を含むいくつかの効率的な配列ソート方法を提供しています。この記事では、Array.Sort()
とArray.Reverse()
を活用する方法、およびLINQのOrderByDescending()
メソッドを使用する方法の2つの主要なアプローチについて説明します。
目次
Array.Sort()
とArray.Reverse()
を使用したソート
Array.Sort()
メソッドは、デフォルトで配列を昇順にソートします。降順にするには、最初に昇順にソートしてから、Array.Reverse()
を使用して配列を反転します。これは、整数や文字列などの単純なデータ型に効率的です。
using System;
public class SortArrayDescending
{
public static void Main(string[] args)
{
int[] numbers = { 5, 2, 8, 1, 9, 4 };
Array.Sort(numbers); // 昇順にソート
Array.Reverse(numbers); // 降順にするために反転
Console.WriteLine("降順にソートされた配列:");
foreach (int number in numbers)
{
Console.Write(number + " ");
}
// 出力: 9 8 5 4 2 1
}
}
これは、この手法を簡潔に示しています。最初の昇順ソートに続いて反転を行うことで、目的の降順が得られます。
OrderByDescending()
を使用したソート
より複雑なシナリオ、特にカスタムオブジェクトを操作する場合や、より洗練されたソート基準が必要な場合は、LINQのOrderByDescending()
メソッドの方が柔軟性が高くなります。このメソッドは、ラムダ式を使用してソートロジックを定義します。
using System;
using System.Linq;
public class SortArrayDescendingLinq
{
public static void Main(string[] args)
{
int[] numbers = { 5, 2, 8, 1, 9, 4 };
var sortedNumbers = numbers.OrderByDescending(x => x).ToArray();
Console.WriteLine("降順にソートされた配列:");
foreach (int number in sortedNumbers)
{
Console.Write(number + " ");
}
// 出力: 9 8 5 4 2 1
// カスタムオブジェクトの例
var people = new[]
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
var sortedPeopleByAge = people.OrderByDescending(p => p.Age).ToArray();
Console.WriteLine("n年齢順に降順でソートされた人物:");
foreach (var person in sortedPeopleByAge)
{
Console.WriteLine($"{person.Name}: {person.Age}");
}
// 出力: Charlie: 35, Alice: 30, Bob: 25
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
}
この例では、整数配列と、年齢でソートされたカスタムPerson
オブジェクトの配列の両方のソートを示しています。OrderByDescending()
はIOrderedEnumerable<T>
を返すため、ToArray()
を使用して配列に変換する必要があることに注意してください。このアプローチは非常に読みやすく、さまざまなソートニーズに適応できますが、単純なデータ型の場合、最初のメソッドよりもわずかにオーバーヘッドが増える可能性があります。
これらのメソッドのどちらを選択するかは、特定のニーズとデータの複雑さに依存します。単純なデータ型の場合は、Array.Sort()
とArray.Reverse()
が効率的です。複雑なオブジェクトや柔軟なソート基準の場合は、OrderByDescending()
の方が強力で読みやすいソリューションです。