c # Intentando invertir una lista

90
public class CategoryNavItem
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Icon { get; set; }

    public CategoryNavItem(int CatID, string CatName, string CatIcon)
    {
        ID = CatID;
        Name = CatName;
        Icon = CatIcon;
    }
}

public static List<Lite.CategoryNavItem> getMenuNav(int CatID)
{
    List<Lite.CategoryNavItem> NavItems = new List<Lite.CategoryNavItem>();

    -- Snipped code --

    return NavItems.Reverse();
}

Lo contrario no funciona:

Error 3 Cannot implicitly convert type 'void' to 'System.Collections.Generic.List<Lite.CategoryNavItem>'

¿Alguna idea de por qué podría ser esto?

Tom Gullen
fuente

Respuestas:

143

Tratar:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()es un reverso en el lugar ; no devuelve una nueva lista.

Esto hace contraste con LINQ, donde Reverse() vuelve la secuencia invertida, pero cuando hay un método no extensión adecuada se siempre selecciona con preferencia a un método de extensión. Además, en el caso de LINQ tendría que ser:

return someSequence.Reverse().ToList();
Marc Gravell
fuente
1
Para su información, para aquellos que desean revertir una matriz, esto no funciona, debe llamar a Array.Reverse (matriz) en su lugar.
Iain Ward
10
Acabo de sufrir un caso especial interesante: cuando una variable se declara como List<int> list, list.Reverse()llama a la versión local. Luego, un compañero desarrollador es muy inteligente y cambia la declaración a IList<int>. Esto rompe el código de una manera muy inesperada, porque luego IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)se usa la sobrecarga de la función , y esto pasa desapercibido; tendría que estar atento al valor de retorno no utilizado, y eso rara vez se practica en C #
Cee McSharpface
102

Una solución alternativa sería Return NavItems.AsEnumerable().Reverse();

Mafu Josh
fuente
1
eso es bueno y funciona en mi caso (¡deje intacta la lista original)! gracias
ghiboz
20

.Reverse() en una lista invierte los elementos dentro de la lista, no devuelve una nueva lista invertida.

Kieren Johnstone
fuente
8

Reverse()no devuelve la lista invertida en sí, modifica la lista original. Así que reescríbalo de la siguiente manera:

return NavItems.Reverse(); 

A

NavItems.Reverse(); 
return NavItems;
sll
fuente
6

Reverse() no devuelve una lista como se esperaba de su función.

NavItems.Reverse();
return NavItems;
JK.
fuente
Y debido a que devuelve vacío, no puede asignarlo a rev.
Flagbug
3

.Reverse invierte el "en el lugar" ..., intente

NavItems.Reverse();
return NavItems;
Yahia
fuente
2

Si tiene una lista como en su ejemplo:

List<Lite.CategoryNavItem> NavItems

Puede usar el método genérico de extensiones Reverse <> para devolver una nueva lista sin modificar la original. Simplemente use el método de extensión como este:

List<Lite.CategoryNavItem> reversed = NavItems.Reverse<Lite.CategoryNavItem>();

Notas: Debe especificar las etiquetas genéricas <> para utilizar explícitamente el método de extensión. No olvides el

using System.Linq;
MLH
fuente