c # Tentando reverter uma 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();
}

O inverso não funciona:

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

Alguma ideia de por que isso pode ser?

Tom Gullen
fonte

Respostas:

143

Experimentar:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()é um reverso no local ; ele não retorna uma nova lista.

Isto faz contraste com LINQ, onde Reverse() retorna a sequência inversa, mas quando existe um método não-extensão adequada é sempre seleccionado de preferência a um método de extensão. Além disso, no caso do LINQ, teria que ser:

return someSequence.Reverse().ToList();
Marc Gravell
fonte
1
Para sua informação, para aqueles que desejam reverter um array, isso não funciona, você precisa chamar Array.Reverse (array).
Iain Ward
10
Acabei de sofrer de um caso especial interessante: quando uma variável é declarada como List<int> list, então list.Reverse()chama a versão local. Então, um colega desenvolvedor é extremamente inteligente e altera a declaração para IList<int>. Isso quebra o código de uma maneira muito inesperada, porque então a IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)sobrecarga de função é usada e isso passa despercebido - você teria que observar o valor de retorno não utilizado e isso raramente é praticado em C #
Cee McSharpface
102

Uma solução alternativa seria Return NavItems.AsEnumerable().Reverse();

Mafu Josh
fonte
1
isso é bom e funciona no meu caso (deixe a lista original intacta)! obrigado
ghiboz
20

.Reverse() em uma lista inverte os itens da lista, não retorna uma nova lista invertida.

Kieren Johnstone
fonte
8

Reverse()não retorna a lista invertida em si, ele modifica a lista original. Portanto, reescreva da seguinte forma:

return NavItems.Reverse(); 

PARA

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

Reverse() não retorna uma lista conforme o esperado de sua função.

NavItems.Reverse();
return NavItems;
JK.
fonte
E porque ele retorna vazio, você não pode atribuí-lo ao rev.
Flagbug
3

.Reverse inverte o "no local" ..., tente

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

Se você tiver uma lista como em seu exemplo:

List<Lite.CategoryNavItem> NavItems

Você pode usar o método genérico Reverse <> extensions para retornar uma nova lista sem modificar a original. Basta usar o método de extensão como este:

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

Notas: Você precisa especificar as <> tags genéricas para usar explicitamente o método de extensão. Não se esqueça do

using System.Linq;
MLH
fonte