特定のプロパティでオブジェクトのリストを効率的にソートすることは、C#開発者にとって重要なスキルです。この記事では、LINQのOrderBy
メソッドと、デリゲートを使ったList<T>.Sort
メソッドという2つの主要なアプローチを探ります。それぞれの長所と短所を検討し、特定のニーズに最適な方法を選択できるようにします。
目次
LINQのOrderBy
メソッドの使用
LINQのOrderBy
メソッドは、リストをクリーンで可読性の高い方法でソートします。ラムダ式を使用してソート基準を指定し、新しいソート済みリストを返し、元のリストは変更しません。これは、元のデータを保持する必要がある場合に理想的です。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Example
{
public static void Main(string[] args)
{
List<Person> people = new List<Person>()
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
// 名前でソート(昇順)
var sortedByName = people.OrderBy(p => p.Name).ToList();
Console.WriteLine("名前でソート済み:");
PrintPeople(sortedByName);
// 年齢でソート(降順)
var sortedByAgeDescending = people.OrderByDescending(p => p.Age).ToList();
Console.WriteLine("n年齢でソート済み(降順):");
PrintPeople(sortedByAgeDescending);
}
static void PrintPeople(List<Person> people)
{
foreach (var person in people)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
}
}
List<T>.Sort
でのデリゲートの使用
より多くの制御が必要な場合、またはソートロジックの再利用が必要な場合は、デリゲートが強力な代替手段となります。List<T>.Sort
メソッドは、リストをインプレースでソートし、元のリストを直接変更します。これは非常に大きなリストの場合により効率的ですが、元のデータが変更されることに注意してください。
using System;
using System.Collections.Generic;
// ... 上記のPersonクラス ...
public class Example
{
public static void Main(string[] args)
{
List<Person> people = new List<Person>()
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
// デリゲートを使用して名前でソート(昇順)
people.Sort((p1, p2) => p1.Name.CompareTo(p2.Name));
Console.WriteLine("名前でソート済み(インプレース):");
PrintPeople(people);
// デリゲートを使用して年齢でソート(降順)
people.Sort((p1, p2) => p2.Age.CompareTo(p1.Age)); // 降順のため順序が逆転していることに注意
Console.WriteLine("n年齢でソート済み(降順、インプレース):");
PrintPeople(people);
}
// ... 上記のPrintPeopleメソッド ...
}
適切な方法の選択
最適なアプローチは、特定の要件によって異なります。
OrderBy
(LINQ): 元のリストを保持することが重要な単純なソートタスクに最適です。一般的に可読性が高いです。List<T>.Sort
(デリゲート付き): より多くの制御を提供し、元のリストの変更が許容される場合、非常に大きなリストに対してより効率的になる可能性があります。複雑な比較ロジックや再利用可能なソート関数に役立ちます。
元のリストの順序を維持する必要があるかどうか、およびアプリケーションのパフォーマンスへの影響を慎重に検討してから、選択してください。