C# での List<T> のオブジェクトのプロパティによるソート: コード例解説
C# での List<T> のオブジェクトのプロパティによるソート
C# の List<T>
はジェネリックコレクションで、任意の型のオブジェクトを格納できます。このリストをオブジェクト内の特定のプロパティに基づいてソートすることができます。
方法
主に2つの方法があります:
OrderBy メソッドを使用する (LINQ)
LINQ (Language Integrated Query) の OrderBy
メソッドは、リストを昇順でソートするのに便利です。
using System.Linq;
// 例: Person クラス
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// リストをソートする
List<Person> people = ...; // 人のリスト
var sortedPeopleByName = people.OrderBy(p => p.Name).ToList();
var sortedPeopleByAge = people.OrderBy(p => p.Age).ToList();
OrderBy(p => p.Name)
は、people
リスト内の各要素p
のName
プロパティに基づいて昇順でソートします。ToList()
は、結果を新しいリストに変換します。
Sort メソッドを使用する (比較関数)
Sort
メソッドは、リスト自体を直接変更し、より効率的です。比較関数を使用してソート基準を指定します。
using System.Collections.Generic;
// 例: Person クラス
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// リストをソートする
List<Person> people = ...; // 人のリスト
// 名前で昇順ソート
people.Sort((p1, p2) => p1.Name.CompareTo(p2.Name));
// 年齢で降順ソート
people.Sort((p1, p2) => p2.Age.CompareTo(p1.Age));
Sort((p1, p2) => p1.Name.CompareTo(p2.Name))
は、2つのPerson
オブジェクトp1
とp2
を比較し、名前のアルファベット順に基づいてソートします。CompareTo
メソッドは、文字列の比較に使用されます。
重要なポイント
OrderBy
は新しいリストを返し、元のリストは変更されません。Sort
は元のリストを変更します。- 比較関数は、2つのオブジェクトを比較して、負の数、0、または正の数を返す必要があります。負の数は最初のオブジェクトが小さいことを、0は等しいことを、正の数は最初のオブジェクトが大きいことを意味します。
日本語訳
C# の List<T>
は、任意の型のオブジェクトを格納できるジェネリックコレクションです。このリストをオブジェクト内の特定のプロパティに基づいてソートすることができます。
主な方法は2つあります:
- LINQ の
OrderBy
メソッドを使う: 新しいリストを作成して昇順ソートします。 Sort
メソッドを使う: 元のリストを直接変更し、比較関数を使ってソートします。
コード例 1: OrderBy メソッドによるソート
``csharp using System.Linq;
public class Person { public string Name { get; set; } public int Age { get; set; } }
List<Person> people = ...; // 人のリスト
var sortedPeopleByName = people.OrderBy(p => p.Name).ToList(); var sortedPeopleByAge = people.OrderBy(p => p.Age).ToList(); ``
解説:
using System.Linq;
は、LINQ (Language Integrated Query) を使用するための名前空間のインポートです。Person
クラスは、名前 (Name
) と年齢 (Age
) を持つ人の情報を表します。people
は、Person オブジェクトのリストです。sortedPeopleByName = people.OrderBy(p => p.Name).ToList();
は、people
リストをName
プロパティで昇順ソートし、新しいリストsortedPeopleByName
に代入します。OrderBy
メソッドは、指定されたプロパティに基づいて要素を昇順でソートします。p => p.Name
はラムダ式で、各Person
オブジェクトp
のName
プロパティを返すことを指定します。
sortedPeopleByAge = people.OrderBy(p => p.Age).ToList();
は、同様にpeople
リストをAge
プロパティで昇csharp using System.Collections.Generic;
List<Person> people = ...; // 人のリスト
people.Sort((p1, p2) => p1.Name.CompareTo(p2.Name)); people.Sort((p1, p2) => p2.Age.CompareTo(p1.Age)); ``
using System.Collections.Generic;
は、ジェネリックコレクションを使用するための名前空間のインポートです。Person
クラスは、前の例と同じです。people.Sort((p1, p2) => p1.Name.CompareTo(p2.Name));
は、people
リストをName
プロパティで昇順ソートします。Sort
メソッドは、リスト自体を直接変更します。(p1, p2) => p1.Name.CompareTo(p2.Name)
はラムダ式で、2つのPerson
オブジェクトp1
とp2
を比較する比較関数を定義します。CompareTo
メソッドは、文字列の比較に使用され、負の数、0、または正の数を返します。
people.Sort((p1, p2) => p2.Age.CompareTo(p1.Age));
は、同様にpeople
リストをAge
プロパティで降順ソートします。
OrderBy
は新しいリストを作成しますが、Sort
は元のリストを直接変更します。OrderBy
は常に昇順ソートですが、Sort
は比較関数によって昇順または降順にソートできます。
IComparer インターフェースの実装
より複雑なソートロジックが必要な場合、IComparer<T>
インターフェースを実装することでカスタム比較器を作成できます。
using System.Collections.Generic;
public class PersonComparer : IComparer<Person>
{
public int Compare(Person x, Person y)
{
// カスタム比較ロジック
// 例: 名前で昇順、年齢で降順
int nameComparison = x.Name.CompareTo(y.Name);
return nameComparison == 0 ? y.Age.CompareTo(x.Age) : nameComparison;
}
}
この比較器を使用してリストをソートします:
List<Person> people = ...;
people.Sort(new PersonComparer());
ソート対象のクラス自体に比較ロジックが必要な場合、IComparable<T>
インターフェースを実装できます。
public class Person : IComparable<Person>
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person oth er)
{
// カスタム比較ロジック
// 例: 名前で昇順
return Name.CompareTo(other.Name);
}
}
この場合、リストの Sort
メソッドを直接呼び出すだけでソートできます:
List<Person> people = ...;
people.Sort();
拡張メソッド
ソートロジックを再利用したい場合、拡張メソッドを使用できます:
public static class ListExtensions
{
public static void SortByCustom(this List<Person> people)
{
// カスタムソートロジック
people.Sort((p1, p2) => ...);
}
}
使用例:
List<Person> people = ...;
people.SortByCustom();
注意点
IComparer<T>
は複数のオブジェクトの比較に使用され、IComparable<T>
はオブジェクト自身の比較に使用されます。- カスタム比較ロジックは、パフォーマンスに影響を与える可能性があります。
- 複数のプロパティによるソートや複雑な条件が必要な場合は、LINQ の
OrderBy
やThenBy
を検討してください。
c# generics list