107 votes

c# Essayer d'inverser une liste

J'ai le code suivant :

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

Mais je reçois l'erreur suivante :

Impossible de convertir implicitement le type 'void' en 'System.Collections.Generic.List<Lite.CategoryNavItem>'

Vous avez une idée de la raison de cette situation ?

165voto

Marc Gravell Points 482669

Essayez :

NavItems.Reverse();
return NavItems;

List<T>.Reverse() est un en place inverse ; il ne retourne pas une nouvelle liste.

Ce site fait Contrairement à LINQ, où Reverse() renvoie à la séquence inversée, mais lorsqu'il existe une méthode de non-extension appropriée, elle est toujours sélectionné de préférence à une méthode d'extension. De plus, dans le cas de LINQ, il faudrait que ce soit :

return someSequence.Reverse().ToList();

1 votes

Pour info, pour ceux qui veulent inverser un tableau, cela ne fonctionne pas, vous devez appeler Array.Reverse(array) à la place.

18 votes

Je viens de souffrir d'un cas spécial intéressant : Quand une variable est déclarée comme List<int> list entonces list.Reverse() appelle la version in-place. Ensuite, un autre développeur est très intelligent et change la déclaration en IList<int> . Cela casse le code d'une manière très inattendue, car alors la fonction IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source) est utilisée, et cela passe inaperçu - il faudrait surveiller la valeur de retour inutilisée, ce qui est rarement pratiqué en C#.

130voto

Mafu Josh Points 716

Une solution de contournement serait Return NavItems.AsEnumerable().Reverse();

3 votes

C'est bien et ça marche dans mon cas ( laisser la liste originale intacte) ! merci

22voto

Kieren Johnstone Points 19499

.Reverse() sur une liste inverse les éléments de la liste, elle ne renvoie pas une nouvelle liste inversée.

10voto

sll Points 30638

Reverse() ne retourne pas la liste inversée elle-même, elle modifie la liste originale. Il faut donc le réécrire comme suit :

return NavItems.Reverse(); 

À

NavItems.Reverse(); 
return NavItems;

6voto

JK. Points 3792

Reverse() ne renvoie pas une liste comme attendu de votre fonction.

NavItems.Reverse();
return NavItems;

0 votes

Et parce qu'il renvoie un résultat nul, vous ne pouvez pas l'affecter à Rev.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X