データの並べ替え (C#)
並べ替え操作では、1 つ以上の属性に基づいてシーケンスの要素を並べ替えます。 並べ替えの第 1 条件で、要素に対して一回目の並べ替えが実行されます。 第 2 条件を指定すると、第 1 条件で並べ替えられた各グループ内の要素を並べ替えることができます。
重要
これらのサンプルでは、System.Collections.Generic.IEnumerable<T> データ ソースを使用します。 System.Linq.IQueryProvider に基づくデータ ソースでは、System.Linq.IQueryable<T> データ ソースと式ツリーが使用されます。 式ツリーには、許可される C# 構文に制限があります。 さらに、EF Core などの各 IQueryProvider
データ ソースでは、より多くの制限が課される場合があります。 ご利用のデータ ソースのドキュメントをご覧ください。
次の図は、文字のシーケンスに対してアルファベット順の並べ替え操作を実行した結果を示しています。
次のセクションでは、データの並べ替えを実行する標準クエリ演算子のメソッドの一覧を示します。
メソッド
メソッド名 | 説明 | C# のクエリ式の構文 | 説明 |
---|---|---|---|
OrderBy | 値を昇順に並べ替えます。 | orderby |
Enumerable.OrderBy Queryable.OrderBy |
OrderByDescending | 値を降順に並べ替えます。 | orderby … descending |
Enumerable.OrderByDescending Queryable.OrderByDescending |
ThenBy | 2 番目の並べ替えを昇順で実行します。 | orderby …, … |
Enumerable.ThenBy Queryable.ThenBy |
ThenByDescending | 2 番目の並べ替えを降順で実行します。 | orderby …, … descending |
Enumerable.ThenByDescending Queryable.ThenByDescending |
Reverse | コレクションの要素の順序を反転させます。 | 該当なし。 | Enumerable.Reverse Queryable.Reverse |
Note
この記事の次の例では、この領域の共通データ ソースを使用します。
各 Student
は、学年、主要学科、一連のスコアを持っています。 Teacher
は、その教師が授業を受け持つキャンパスを示す City
プロパティも持っています。 Department
は名称と、学科長を務める Teacher
への参照を持っています。
サンプル データ セットは、 source リポジトリにあります。
public enum GradeLevel
{
FirstYear = 1,
SecondYear,
ThirdYear,
FourthYear
};
public class Student
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
public required int ID { get; init; }
public required GradeLevel Year { get; init; }
public required List<int> Scores { get; init; }
public required int DepartmentID { get; init; }
}
public class Teacher
{
public required string First { get; init; }
public required string Last { get; init; }
public required int ID { get; init; }
public required string City { get; init; }
}
public class Department
{
public required string Name { get; init; }
public int ID { get; init; }
public required int TeacherID { get; init; }
}
1 番目の並べ替え (昇順)
次の例は、LINQ クエリで orderby
句を使用して、教師の配列を名字を基準に昇順に並べ替える方法を示しています。
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
次のコードでは、メソッド構文を使用して記述された同等のクエリを示しています。
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
1 番目の並べ替え (降順)
次の例は、LINQ クエリで orderby descending
句を使用して、教師を名字を基準に降順に並べ替える方法を示しています。
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
次のコードでは、メソッド構文を使用して記述された同等のクエリを示しています。
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
2 番目の並べ替え (昇順)
次の例は、LINQ クエリで orderby
句を使用して、1 番目および 2 番目の並べ替えを実行する方法を示しています。 教師は、最初に市区町村を基準として、次に名字を基準として、どちらも昇順に並べ替えられます。
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
次のコードでは、メソッド構文を使用して記述された同等のクエリを示しています。
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
2 番目の並べ替え (降順)
次の例は、LINQ クエリで orderby descending
句を使用して、1 番目の並べ替えを昇順で実行し、2 番目の並べ替えを降順で実行する方法を示しています。 教師は、最初に市区町村を基準として、次に名字を基準として並べ替えられます。
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
次のコードでは、メソッド構文を使用して記述された同等のクエリを示しています。
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
関連項目
.NET