2011-01-12 19 views
9

Tengo un problema con List<T>.Reverse() y Reverse(this IEnumerable<TSource> source). mirada al código:¿Por qué IList <>. Reverse() no funciona como List <>(). Reversa

// Part 1 
    List<int> list = new List<int> { 1, 2, 3 }; 

    foreach (int x in list) 
    Console.Write(x); 

    Console.WriteLine(); 

    list.Reverse(); 

    foreach (int x in list) 
    Console.Write(x); 

    Console.WriteLine(); 
    list.Reverse(); 

    // Part2 
    IList<int> ilist = list; 

    foreach (int x in list) 
    Console.Write(x);  

    Console.WriteLine(); 

    ilist.Reverse(); 

    foreach (int x in ilist) 
    Console.Write(x); 

    Console.WriteLine(); 

    ilist.Reverse(); 

Mi resultado:

123 
321 
123 
123 

porque Reverse() -Part1 es List<T>.Reverse(), Reverse() -Part2 es Reverse(this IEnumerable<TSource> source) quiero ejecutar List<int>.Reverse() en Part2 para IList<int>. ¿Cómo puedo hacerlo?

+2

[Estoy de acuerdo con usted en que esto es confuso.] (Http://stackoverflow.com/questions/2828917/most- awkward-engañoso-método-en-la-red-api/2829051 # 2829051) –

Respuesta

8

IList<int> no tiene un método Reverse, por lo que utiliza el método de extensión. La única forma de usar List<T>.Reverse en su referencia IList<int> es convertirlo o convertirlo a List<int>. De fundición sólo funcionará si está seguro de que es realmente un List<int> en el primer lugar:

IList<int> abstractList; 
var concreteList = (List<int>)abstractList; 
concreteList.Reverse(); 

Otra opción sería la de crear un List<int> de su IList<int> ejemplo, en lugar de asumir que ya es un List<int>:

IList<int> abstractList; 
var concreteList = new List<int>(abstractList); 
concreteList.Reverse(); 

la razón que el método Reverse extensión no afecta realmente a la lista subyacente es debido a que opera en IEnumerable<T>, w que no es necesariamente escribible (ninguno de los métodos de extensión Enumerable realiza cambios en la colección original, devuelve nueva colección).

Para utilizar esta versión de Reverse, sólo tiene que utilizar el producto de la llamada Reverse, en lugar de la lista original:

IList<int> abstractList; 
IEnumerable<int> reversedList = abstractList.Reverse(); 
4

En el segundo ejemplo, se utiliza un método de extensión contra IEnumerable<T>, y esto no está mutando la colección original sino que produce una consulta que daría como resultado una secuencia de su lista original en orden inverso. Es decir, si desea utilizar los resultados de ilist.Reverse(), que diría

var reversedList = iList.Reverse(); 
// reversedList is IEnumerable<int> 
// 'list' and 'ilist' are not changed 

foreach (int item in reversedList) 
    Console.Write(item); 
+0

breve, pero conciso respuesta al problema en cuestión. Me ayudó a salir Gracias +1 –

Cuestiones relacionadas