Question

Je suis friand de programmation défensive. Je déteste lancer des exceptions, mais ce n'est pas le sujet de ma question.

I adapté pour une extension linQ pour être en mesure d'effectuer une commande par un nom de colonne

        public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)

programmation défensive , cette méthode renvoie la donnée dénombrable si le nom de la colonne est pas valide.

Maintenant je dois effectuer un tri secondaire avec ThenBy. Donc, je dois cette signature:

        public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)

Je dois retourner un IOrderedEnumerable. Mon problème est de garder ma fonction de programmation défensive. Je dois retourner le jeu donné est le nom de la colonne est invalide

Y at-il une manière propre à le faire? Tout ce que je pense sont des sortes de trucs:

  • Utilisez la réflexion à l'ordre par la première propriété trouvée, ce qui est risqué parce que la propriété ne peut pas être tri-autorisé
  • Mettre en œuvre ma propre IOrderedEnumerable, ce qui est trop risqué parce que je joue sur la commande IQueryable ou IList, alors j'effectuer d'autres opérations LinQ, je crains les effets secondaires.

Et des conseils / suggestion? Merci

Était-ce utile?

La solution

Vous pouvez faire une commande. Si la colonne n'existe pas, il suffit de laisser vos commentaires dénombrable comme avant. Pour ce faire, créez sélecteur à clé qui retourne la même valeur pour tous les éléments.

Voir par exemple:

using System;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;

static class Program
{
    public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression) where T : class
    {
        Func<T, Int32> keySelector = (elem) =>
        {
            PropertyInfo pi = typeof(T).GetProperty(sortExpression, typeof(Int32));
            if (pi == null)
                return 0; // return the same key for all elements

            return Int32.Parse(pi.GetValue(elem, null).ToString());
        };

        return list.OrderBy(keySelector);
    }

    static void Main(string[] args)
    {
        // Create an array of strings to sort.
        string[] fruits = { "apricot", "orange", "banana", "mango", "apple", "grape", "strawberry" };

        // Sort by "column" Length
        foreach (string s in fruits.OrderBy<string>("Length"))
            Console.WriteLine(s);
        Console.WriteLine();

        // Sort by non-existing column
        foreach (string s in fruits.OrderBy<string>("ength"))
            Console.WriteLine(s);
        Console.ReadKey();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top