2009-06-12 7 views
9

Tengo un List<T> y quiero obtener los valores en orden inverso. Lo que no quiero es invertir la lista en sí.Explícitamente use el método de extensión

Esto no parece ningún problema ya que hay un método de extensión Reverse() para IEnumerable<T> que hace exactamente lo que quiero.

Mi problema es que también hay un método Reverse() para List<T> que invierte la lista y devuelve el vacío.

Sé que hay un montón de maneras de recorrer la lista en orden inverso, pero mi pregunta es:

¿Cómo le digo al compilador que quiero usar el método de extensión con el mismo nombre?

var list = new List<int>(new [] {1, 2, 3}); 
DumpList(list.Reverse());     // error 

Respuesta

13

La mejor manera de obligar explicitamente a un método de extensión en particular es llamarlo usando la sintaxis de método compartido. En su caso, que haría que al igual que:

DumpList(Enumerable.Reverse(list)); 

El problema con algunos de los otros enfoques mencionados aquí es que no siempre va a hacer lo que quiera. Por ejemplo, echando la lista de este modo:

((IEnumerable)list).Reverse() 

podría terminar llamando a un método completamente diferente dependiendo de los espacios de nombres que ha importado, o qué tipo de código de llamada se definen en

La única manera. estar 100% seguro de que se une a un método de extensión particular es usar la sintaxis del método compartido.

+0

Esta es mi humilde opinión la mejor respuesta a mi pregunta, así que estoy dando los créditos. – VVS

+0

A menos que escriba el espacio de nombre completo y el nombre de la clase, ambas soluciones tienen el mismo problema potencial de importación de espacio de nombres. Entonces ninguno de los dos es realmente mejor, solo es cuestión de preferencia. –

+0

Ese caso es mucho menos probable (y, como dijiste, puedes calificar completamente el nombre). En general, los métodos de extensión están destinados a estar sobrecargados, y ser menos preferidos que los métodos de instancia. Si está tratando de suprimir la resolución de sobrecarga del método de extensión, entonces es mejor no usar la sintaxis del método de extensión. –

9
var list = new List<int>(new [] {1, 2, 3}); 
DumpList((list as IEnumerable<int>).Reverse()); 

O

IEnumerable<int> list = new List<int>(new [] {1, 2, 3}); 
DumpList(list.Reverse()); 
+0

Ay, por supuesto .. hora de ir a casa :) – VVS

0

Si no te importa la fealdad, y que escribió el método de extensión, siempre se puede llamar:

MyExtensions.Reverse(list); 

Es todavía sólo un método estático en el corazón. Me di cuenta de esto ayer cuando ReSharper se volvió loco y decidió reescribir la mitad de mis métodos de extensión como llamadas al método estático.

En cuanto al uso de IEnumerable <T> vs. Lista <T>, no parece tan simple. Mi primera idea sería utilizar:

IEnumerable<T>.Reverse<T>(list); 

Pero eso me da un error de compilación, y la respuesta de Juan es correcta para IEnumerable/Lista.

2

No tiene que convertir el parámetro para seleccionar el método correcto ... solo necesita ser más específico sobre el método.

List<int> list = new List<int>() {1, 2, 3}; 
DumpList(Enumerable.Reverse(list)); 
1

Esto parece funcionar

var stuff = new List<int>(); 
    var list = Enumerable.Reverse(stuff); 
Cuestiones relacionadas