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?

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();

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();


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.


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;

6

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

NavItems.Reverse();
return NavItems;

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;

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.