データの並べ替え (C#)

並べ替え操作では、1 つ以上の属性に基づいてシーケンスの要素を並べ替えます。 並べ替えの第 1 条件で、要素に対して一回目の並べ替えが実行されます。 第 2 条件を指定すると、第 1 条件で並べ替えられた各グループ内の要素を並べ替えることができます。

次の図は、文字のシーケンスに対してアルファベット順の並べ替え操作を実行した結果を示しています。

Graphic that shows an alphabetical sort operation.

次のセクションでは、データの並べ替えを実行する標準クエリ演算子のメソッドの一覧を示します。

メソッド

メソッド名 説明 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

この記事の次の例では、この分野の一般的なデータ ソースが使用されています。

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; }
}

Student は、学年、主要学科、一連のスコアを持っています。 Teacher は、その教師が授業を受け持つキャンパスを示す City プロパティも持っています。 Department には名称と、学科長を務める Teacher への参照があります。

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}");
}

関連項目