C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のLINQでOrderByとGroupByを使う方法!サンプルコード付きで解説

C#のLINQには、コレクション内のデータを操作するためのさまざまな演算子が用意されています。本記事では、その中でも特によく使われる「OrderBy(並べ替え)」と「GroupBy(グループ化)」の基本的な使い方を、サンプルコードと実行結果をもとにわかりやすく解説します。

OrderByとは?

OrderByは、配列やListなどのシーケンスを、指定したキーに基づいて昇順に並べ替えるための演算子です。文字列の場合は五十音順・アルファベット順、数値の場合は大小順にソートされます。

降順で並べ替えたい場合は、OrderByDescendingメソッドを使用します。

// 昇順でソート
var asc = items.OrderBy(x => x.Category);

// 降順でソート
var desc = items.OrderByDescending(x => x.Category);

GroupByとは?

GroupByは、グループ化演算子カテゴリに属する演算子です。フラットな状態の要素シーケンスを受け取り、指定したキーに基づいてIGrouping<K, V>形式のグループへと整理し、グループ化されたシーケンスを返します。

GroupByの使用例

ここでは、電子機器のリストを「Category(カテゴリ)」ごとにグループ化し、さらに各グループ内のアイテムを「Name(商品名)」の昇順で並べ替える例を紹介します。

class ElectronicGoods {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }

    public static List<ElectronicGoods> GetElectronicItems() {
        return new List<ElectronicGoods>() {
            new ElectronicGoods { Id = 1, Name = "Mobile", Category = "Phone" },
            new ElectronicGoods { Id = 2, Name = "LandLine", Category = "Phone" },
            new ElectronicGoods { Id = 3, Name = "Television", Category = "TV" },
            new ElectronicGoods { Id = 4, Name = "Grinder", Category = "Food" },
            new ElectronicGoods { Id = 5, Name = "Mixer", Category = "Food" },
        };
    }
}

class Program {
    static void Main() {
        // カテゴリごとにグループ化し、各グループ内を商品名の昇順にソート
        var res = ElectronicGoods.GetElectronicItems()
            .GroupBy(x => x.Category)
            .Select(x => new {
                Key = x.Key,
                electronicGoods = x.OrderBy(c => c.Name)
            });

        foreach (var group in res) {
            Console.WriteLine("{0} - {1}", group.Key, group.electronicGoods.Count());
            Console.WriteLine("----------");

            foreach (var item in group.electronicGoods) {
                Console.WriteLine(item.Name + "\t" + item.Category);
            }
            Console.WriteLine();
            Console.WriteLine();
        }

        Console.ReadKey();
    }
}

実行結果

カテゴリごとにアイテムがまとめられ、各グループ内では商品名のアルファベット順に表示されていることがわかります。

Phone - 2
----------
LandLine    Phone
Mobile      Phone

TV - 1
----------
Television  TV

Food - 2
----------
Grinder     Food
Mixer       Food

OrderByの使用例

同じ電子機器リストを、今度はカテゴリ名をキーとして昇順に並べ替えてみます。

class Program {
    static void Main() {
        // カテゴリ名をキーに昇順でソート
        var res = ElectronicGoods.GetElectronicItems().OrderBy(x => x.Category);

        foreach (var item in res) {
            Console.WriteLine(item.Name + "\t" + item.Category);
        }

        Console.ReadKey();
    }
}

実行結果

カテゴリ名のアルファベット順(Food → Phone → TV)に、アイテム全体が並べ替えられています。

Grinder     Food
Mixer       Food
Mobile      Phone
LandLine    Phone
Television  TV

まとめ

  • OrderBy:シーケンスを指定したキーで昇順にソートする(降順の場合はOrderByDescendingを使用)
  • GroupBy:指定したキーに基づいてシーケンスをグループ化し、IGrouping<K, V>のコレクションとして返す
  • GroupByでグループ化した後、各グループ内に対してOrderByを適用するなど、両者は組み合わせて柔軟に活用できる
  1. Google Chromeのタブグループ活用術!作成・追加・移動・復元まで完全ガイド

    仕事や学業、リサーチなどで複数のウェブサイトを開く必要があると、気づけばタブが大量に増えていて、「あのページどこだっけ?」と探すことに時間を取られてしまうことはありませんか。 そんな悩みを解決してくれるのが、Google Chromeの「タブグループ」機能です。関連するタブをひとつにまとめて名前や色を付けられるため、必要なときだけ展開し、使わないときは折りたたんでスッキリ整理できます。この記事では、タブグループの基本的な使い方から便利な応用テクニックまで、わかりやすく解説します。 Chromeで新しいタブグループを作成する まず、グループにまとめたいタブを1つ選択します。そのタブを右クリックし

  2. Chromeの「タブグループ」を使いこなす方法 – 散らかったタブを劇的に整理する技

    Google Chromeでいつも何十個ものタブを開いてしまっているなら、この記事はまさにあなたのためのものです。 大量のWebページを開きっぱなしにしていると、パソコンの動作が遅くなるだけでなく、目的のタブを見つけるのも一苦労。そんな悩みを解決してくれるのが、Chromeに最初から搭載されている「タブグループ」機能です。存在を知らなかったという人も多いはずですが、この便利な機能を使えば、関連するタブをひとつのグループにまとめ、名前を付けて、折りたたんでタブ1つ分のスペースに収めることができます。 例えば、新しいギターを購入しようとしているとしましょう。気になるモデルのレビューや販売店のペ