Frage

Ich mag Defensivprogramme. Ich hasse es, Ausnahme zu werfen, aber das ist nicht Gegenstand meiner Frage.

Ich habe eine Erweiterung an Linq angepasst, um eine Bestellung mit einem Spaltennamen durchzuführen

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

Mit Defensivprogrammierung, Diese Methode gibt die angegebene aufzählbare, wenn der Spaltenname nicht gültig ist.

Jetzt muss ich eine ausführen Sekundärsortierung mit thenby. Also brauche ich diese Unterschrift:

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

Ich muss eine iordedenumerable zurückgeben. Mein Problem ist es, meine defensive Programmierfunktion beizubehalten: Ich muss zurückgeben. Der angegebene Satz ist der Spaltenname ungültig.

Gibt es einen sauberen Weg, dies zu tun? Ich denke nur an Tricks:

  • Verwenden Sie Reflection, um durch die erste gefundene Eigenschaft zu bestellen, was riskant ist, da die Eigenschaft möglicherweise nicht sortiert ist
  • Implementieren Sie meine eigene iordedenUmerable, was auch riskant ist, weil ich Bestellung für iQueryable oder IList durchführe, dann andere Linq -Operationen durchführe, also fürchte ich Nebenwirkungen.

Und Ratschläge / Vorschlag? Vielen Dank

War es hilfreich?

Lösung

Sie können jede Bestellung machen. Wenn keine Spalte vorhanden ist, lassen Sie Ihre Eingabe einfach so wie zuvor aufgezählt. Erstellen Sie dazu den Schlüsselauswahl, der für alle Elemente den gleichen Wert zurückgibt.

Siehe Beispiel:

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();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top