En C#, la méthode OrderBy de LINQ permet de trier les données en fonction de propriétés ou d'expressions spécifiées. Mais comment spécifier dynamiquement la propriété ou l’expression à trier ?
Question :
Étant donné un paramètre, nous souhaitons trier la liste des étudiants en fonction de l'attribut spécifié, mais actuellement, le nom de l'attribut dans l'appel OrderBy est codé en dur.
Exemple :
<code class="language-csharp">List<Student> existingStudents = new List<Student> { new Student { ... }, new Student { ... } }; List<Student> orderByAddress = existingStudents.OrderBy(c => c.Address).ToList();</code>
Cible :
Nous souhaitons prendre le nom de la propriété comme paramètre au lieu d'utiliser le nom de la propriété statique dans OrderBy.
Exemple :
<code class="language-csharp">string param = "City"; List<Student> orderByCity = existingStudents.OrderBy(c => c.City).ToList(); //仍然需要明确指定属性</code>
Solution :
Grâce à la réflexion, nous pouvons construire dynamiquement une expression OrderBy :
<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderByProperty, bool desc) { // ... (反射代码构建表达式树) ... return source.Provider.CreateQuery<T>(resultExpression); }</code>
Vous pouvez ensuite trier dynamiquement selon les attributs spécifiés :
<code class="language-csharp">existingStudents.OrderBy("City", true); // 降序 existingStudents.OrderBy("City", false); // 升序</code>
(Remarque : l'implémentation complète du code de réflexion est plus compliquée et est omise ici. Vous devez utiliser l'espace de noms System.Linq.Expressions
pour créer l'arborescence d'expression et gérer les exceptions possibles, telles que les attributs qui n'existent pas.) Cette solution propose l'idée d'un tri dynamique. La mise en œuvre complète nécessite d'écrire du code plus robuste en fonction de la situation réelle. Utiliser c => param
directement est une erreur, car cela ne triera que la chaîne de paramètres elle-même, pas les propriétés de l'objet étudiant. La réflexion doit être utilisée pour obtenir dynamiquement des propriétés et construire l’arborescence d’expression correcte.
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!