LINQ を使用したデータのピボット
データ処理において、ピボットとは、データを複数の列と行を含む形式から複数の行を含む形式に変換することを指します。行と列。 LINQ を使用してデータ ピボットを実行する方法は次のとおりです。
TypeCode 列挙型と User オブジェクトを含む項目のコレクションを考えてみましょう。問い合わせで説明されているように、提供されたサンプル データに示すように、コレクションをフラット化し、グリッドのような構造で表示したいと考えています。
TypeCode | User |
---|---|
1 | Don Smith |
1 | Mike Jones |
1 | James Ray |
2 | Tom Rizzo |
2 | Alex Homes |
3 | Andy Bates |
必要な出力は次のとおりです。
1 | 2 | 3 |
---|---|---|
Don Smith | Tom Rizzo | Andy Bates |
Mike Jones | Alex Homes | |
James Ray |
LINQ ソリューション:
LINQ は、この種のピボット操作を効率的に処理できます。以下はその方法を示すコード スニペットです:
// Sample data var data = new[] { new { Foo = 1, Bar = "Don Smith"}, new { Foo = 1, Bar = "Mike Jones"}, new { Foo = 1, Bar = "James Ray"}, new { Foo = 2, Bar = "Tom Rizzo"}, new { Foo = 2, Bar = "Alex Homes"}, new { Foo = 3, Bar = "Andy Bates"}, }; // Group into columns and select rows per column var grps = from d in data group d by d.Foo into grp select new { Foo = grp.Key, Bars = grp.Select(d2 => d2.Bar).ToArray() }; // Find the total number of (data) rows int rows = grps.Max(grp => grp.Bars.Length); // Output columns foreach (var grp in grps) { Console.Write(grp.Foo + "\t"); } Console.WriteLine(); // Output data for (int i = 0; i < rows; i++) { foreach (var grp in grps) { Console.Write((i < grp.Bars.Length ? grp.Bars[i] : null) + "\t"); } Console.WriteLine(); }
出力:
1 2 3
Don Smith Tom Rizzo Andy Bates
Mike Jones Alex Homes
James Ray
この LINQ ソリューションは効果的です同じ Foo 値を持つ項目をグループ化し、列ごとにバー (ユーザー名) を選択することで、データを目的の形式にピボットします。各列のエントリに基づいて最大行数を計算し、適切に構造化された表形式で出力を生成します。
以上がLINQ を使用してデータをピボットするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。