使用 LINQ 透视数据
在某些情况下,有必要将数据重组为不同的格式。一项常见的任务是旋转数据,将其从表格结构转换为更简洁的布局。虽然像 foreach 循环这样的传统迭代方法可以实现这一点,但它们在迭代过程中带来了集合修改的挑战。输入 LINQ,这是一种功能强大的查询语言,可以简化数据操作,为数据透视提供更清晰、更高效的解决方案。
考虑包含枚举 (TypeCode) 和 User 实例的对象集合。目标是将此集合展平为类似网格的结构,其中每个 TypeCode 对应于一列,用户名按行排列。
LINQ 提供了一种实现此透视操作的简单方法。通过按类型代码对集合进行分组,然后选择用户名作为每个组的数组,我们可以有效地创建列。以下代码片段演示了这种方法:
// 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() };
创建列后,我们需要确定总行数,这是组中任何用户数组的最大长度。有了这些信息,我们就可以遍历每个组并显示相应的用户名,并在必要时用空值填充。
// 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中文网其他相关文章!