2009-09-24 12 views
2

Les méthodes génériques en général sont nouvelles pour moi. Besoin d'une méthode qui renvoie une collection d'un type générique, mais prend également une collection du même type générique et prendMéthodes génériques en C#

Expression<Func<GenericType, DateTime?>>[] Dates 
paramètre

. T tout au long de la fonction suivante doit être du même type, donc en ce moment j'utilisais (version simplifiée):

private static Collection<T> SortCollection<T>(Collection<T> SortList, Expression<Func<T, DateTime>>[] OrderByDateTime) 
{ 
    return SortList.OrderBy(OrderByDateTime[0]); 
} 

mais je reçois l'erreur:

Error: The type arguments for method 'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumberable, System.Func)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Y at-il de toute façon de le faire?

Répondre

4

Dans cette situation, le compilateur omet de comprendre quels sont les arguments de type vous avez l'intention de fournir à la méthode OrderBy, de sorte que vous aurez à les fournir explicitement:

SortList.OrderBy<T, DateTime>(OrderByDateTime[0]) 

Vous voudrez probablement appelez le ToList() si vous voulez qu'une Collection soit retournée

+0

Je l'essaie et il dit: 'System.Collections.ObjectModel.Collection ' ne contient pas une définition de 'OrderBy' et la meilleure surcharge de méthode d'extension 'System.Linq.Enumerable.OrderyBy (System .Collections.Generic.IEnumerable , System.Funct ) 'a certains arguments non valides. – Steph

+0

ok try this: retourner une nouvelle Collection (SortList.OrderBy (OrderByDateTime [0] .Compile()). ToList()); –

+0

bien c'est au moins ne pas me donner une erreur de compilateur, j'espère que cela va fonctionner :-) Merci! – Steph

6

Désolé d'avoir répondu deux fois, mais c'est une autre solution légitime.

Vous êtes de passage dans un Expression<Func<T, DateTime>> mais Orderby veut un Func<T, DateTime>

Vous pouvez compiler l'expression:

return new Collection<T>(SortList.OrderBy(OrderByDateTime[0].Compile()).ToList()); 

ou passer funcs tout droit sorti comme arguments:

private static Collection<T> SortCollection<T>(Collection<T> SortList, Func<T, DateTime>[] OrderByDateTime) 
{ 
    return new Collection<T>(SortList.OrderBy(OrderByDateTime[0]).ToList()); 
} 

Je vous recommande de lire sur Expressions on msdn

+0

Fera, j'aime mieux cette solution de toute façon je pense donc je vais essayer ça. Merci encore. – Steph

+0

De mon point de vue, c'est aussi la réponse la plus précise. Si vous le souhaitez, vous pouvez changer la "réponse acceptée" à celui-ci plutôt que mon autre réponse pour aider d'autres personnes avec la même question –

Questions connexes