2009-06-08 25 views
5

Mi piacerebbe essere in grado di passare in un Func < T,? > che mi permette di scegliere esattamente come ordinare un elenco di elementi ... il problema che ho è il tipo di ritorno potrebbe variare ... quindi per esempio voglio fare qualcosa di simile (non codice di produzione):Funzione di ordinamento Linq generico?

Func<POline, string> poLineOrder 
if (option) poLineOrder = poline => poline.PartNumber; 
else poLineOrder = poline => poline.LineOrder; 
var orderedLines = poLines.OrderBy(poLineOrder); 

Il problema qui è che mentre PartNumber è una stringa, LineOrder è un int, e questo codice non viene compilato. Ho la sensazione che dovrò costruire un'espressione (?) Ma non riesco a trovare la sintassi giusta.

(Sì, posso risolvere questo problema, utilizzando poline.LineOrder.ToString ("D10"), ma che sto chiedendo la questione più generale qui ... grazie!)

-mdb

risposta

5

OrderBy aspetta una chiave-selettore-funzione del tipo Func<Item, Key> e un optional IComparer<Key> per definire il confronto stesso.

Hai bisogno dei seguenti definizioni: helper

class FunctorComparer<T> : IComparer<T> { 
     private readonly Comparison<T> m_Comparison; 

     public FunctorComparer(Comparison<T> Comparison) { 
      this.m_Comparison = Comparison; 
     } 

     public int Compare(T x, T y) { 
      return m_Comparison(x, y); 
     } 
    } 

    static Comparison<TKey> Compare<TKey, TRes>(Func<TKey, TRes> Selector) where TRes : IComparable<TRes> { 
     return (x, y) => Selector(x).CompareTo(Selector(y)); 
    } 

Ora è possibile scrivere

Comparison<POLine> x; 

if (option) 
    x = Compare<POLine, int>(l => l.PartNumber); 
else 
    x = Compare<POLine, string>(l => l.LineOrder); 

var res = poLines.OrderBy(i => i, new FunctorComparer<POLine>(x)); 
3

Potresti prendere in considerazione l'utilizzo di Dynamic LINQ da VS2008 Samples. Poi si può fare:

var orderedLines = poLines.OrderBy(poLineOrder ? "PartNumber" : "LineOrder"); 
+0

cura di commentare la downvote? – tvanfosson

+0

@ tvanfosson, ho ricevuto lo stesso trattamento per un approccio diverso ma valido. Sembra che qualcuno volesse solo svendere :( – JaredPar

Problemi correlati