LINQ によるデータのピボット
特定のシナリオでは、データを別の形式に再構築する必要があります。一般的なタスクの 1 つは、データをピボットして、表構造からより凝縮されたレイアウトに変換することです。 foreach ループのような従来の反復アプローチでもこれを実現できますが、反復中にコレクションを変更するという課題が生じます。 LINQ は、データ操作を簡素化し、データをピボットするためのよりクリーンで効率的なソリューションを提供する強力なクエリ言語です。
列挙 (TypeCode) と User インスタンスを含むオブジェクトのコレクションを考えてみましょう。目標は、このコレクションをグリッド状の構造にフラット化し、各 TypeCode が列に対応し、ユーザー名が行に配置されるようにすることです。
LINQ は、このピボット操作を実現する簡単な方法を提供します。コレクションを TypeCode でグループ化し、各グループの配列としてユーザー名を選択することで、効率的に列を作成できます。次のコード スニペットは、このアプローチを示しています。
// Sample data var data = new[] { new { TypeCode = 1, User = "Don Smith" }, new { TypeCode = 1, User = "Mike Jones" }, new { TypeCode = 1, User = "James Ray" }, new { TypeCode = 2, User = "Tom Rizzo" }, new { TypeCode = 2, User = "Alex Homes" }, new { TypeCode = 3, User = "Andy Bates" } }; // Group by TypeCode and select User name arrays var groups = from d in data group d by d.TypeCode into grp select new { TypeCode = grp.Key, Users = grp.Select(d2 => d2.User).ToArray() };
列を作成した後、グループ内のユーザー配列の最大長である行の合計数を決定する必要があります。この情報を使用して、各グループを反復処理し、必要に応じて null 値を埋め込んで、対応するユーザー名を表示できます。
// Find total number of rows int rows = groups.Max(grp => grp.Users.Length); // Output columns foreach (var grp in groups) { Console.Write(grp.TypeCode + "\t"); } Console.WriteLine(); // Output rows for (int i = 0; i < rows; i++) { foreach (var grp in groups) { Console.Write((i < grp.Users.Length ? grp.Users[i] : null) + "\t"); } Console.WriteLine(); }
LINQ のグループ化機能と選択機能を活用することで、このコードにより、データを収集し、簡潔かつ効率的な方法で目的の出力を生成します。
以上がLINQ はデータのピボットと再構築をどのように簡素化できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。