Pivoter les données avec LINQ
Dans certains scénarios, la restructuration des données dans un format différent devient nécessaire. Une tâche courante consiste à faire pivoter les données, en les transformant d'une structure tabulaire en une présentation plus condensée. Bien que les approches itératives traditionnelles telles que les boucles foreach puissent y parvenir, elles introduisent des défis liés aux modifications de collection au cours de l'itération. Entrez LINQ, un langage de requête puissant qui simplifie la manipulation des données, offrant une solution plus propre et plus efficace pour faire pivoter les données.
Considérez une collection d'objets contenant une énumération (TypeCode) et une instance utilisateur. L'objectif est d'aplatir cette collection dans une structure de type grille, où chaque TypeCode correspond à une colonne et les noms d'utilisateur sont disposés en lignes.
LINQ fournit un moyen simple de réaliser cette opération de pivot. En regroupant la collection par TypeCode, puis en sélectionnant les noms d'utilisateurs sous forme de tableau pour chaque groupe, nous pouvons créer efficacement des colonnes. L'extrait de code suivant illustre cette approche :
// 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() };
Après avoir créé les colonnes, nous devons déterminer le nombre total de lignes, qui correspond à la longueur maximale de tout tableau utilisateur dans les groupes. Avec ces informations, nous pouvons parcourir chaque groupe et afficher les noms d'utilisateur correspondants, en complétant avec des valeurs nulles si nécessaire.
// 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(); }
En tirant parti des capacités de regroupement et de sélection de LINQ, ce code nous permet de faire pivoter le données et générer le résultat souhaité de manière concise et efficace.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!