検証データ
ゲームソフトを題材にしたデータ郡があったとします。
// ゲームソフト class GameSoft { public string Title; // ゲームタイトル public string Company; // 販売メーカー } // ゲームソフトリスト GameSoft[] softs = new GameSoft[] { new GameSoft(){ Title = "バーチャファイター", Company= "セガ" }, new GameSoft(){ Title = "ドラコンクエスト", Company= "スクエニ" }, new GameSoft(){ Title = "バイオハザード", Company= "カプコン" }, new GameSoft(){ Title = "マリオブラザーズ", Company= "ニンテンドウ" }, new GameSoft(){ Title = "ファイルファンタジー", Company= "スクエニ" }, new GameSoft(){ Title = "ゼルダの伝説", Company= "ニンテンドウ" }, new GameSoft(){ Title = "ぷよぷよ", Company= "セガ" }, new GameSoft(){ Title = "ストリートファイター", Company= "カプコン" }, new GameSoft(){ Title = "どうぶつの森", Company= "ニンテンドウ" }, new GameSoft(){ Title = "SPIKE OUT", Company= "セガ" }, }; ~~
これを会社(Company)単位で別々の配列にするには?といった内容です。
キーでグループ化 (GroupdBy)
GroupBy(x => x.キー名)
でキーごとに配列を階層化できます!
※正確に言うとIEnumerable
型になります。
using System.Linq; ~~~ // 会社名で仕分け var groups = softs.GroupBy(x => x.Company); // 各会社ごとに走査 foreach (var group in groups) { // KeyはCompanyと同義 Debug.Log(($"[{group.Key}]")); // 会社名をログ表示 // softはGameSoftクラス foreach (var soft in group) { Debug.Log(($"・{soft.Title}")); // ゲームタイトルをログ表示 } } ~~~~ 以下出力されたログ [セガ] ・バーチャファイター ・ぷよぷよ ・SPIKE OUT [スクエニ] ・ドラコンクエスト ・ファイルファンタジー [カプコン] ・バイオハザード ・ストリートファイター [ニンテンドウ] ・マリオブラザーズ ・ゼルダの伝説 ・どうぶつの森
このようにバラバラだった1次元配列を会社ごとの配列に仕分けるといったことができました。
グループの並び順を変えたい場合
ログを見ていただければ分かると思いますが、並び順は大元の配列に依存しています。
並び順にルールを持たせたいのあれば、OrderBy
やOrderByDescending
を使います。
var groups = softs.GroupBy(x => x.Company); // 会社名昇順で並び替え foreach (var group in groups.OrderBy(x => x.Key)) { Debug.Log(($"[{group.Key}]")); // ゲームタイトル昇順で並び替え foreach (var soft in group.OrderBy(x => x.Title)) { Debug.Log(($"・{soft.Title}")); } } ~~~~ 以下出力されたログ [カプコン] ・ストリートファイター ・バイオハザード [スクエニ] ・ドラコンクエスト ・ファイルファンタジー [セガ] ・SPIKE OUT ・バーチャファイター ・ぷよぷよ [ニンテンドウ] ・ゼルダの伝説 ・どうぶつの森 ・マリオブラザーズ
このように「あいうえお」順に並び替えされていることが分かります。
配列の並び替えについてはこちらの記事で詳しく解説してます。