c # Essayer d'inverser une liste

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

L'inverse ne fonctionne pas:

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

Des idées pourquoi cela pourrait être?

Tom Gullen
la source

Réponses:

143

Essayer:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()est un revers en place ; il ne renvoie pas de nouvelle liste.

Cela fait contraste avec LINQ, où Reverse() renvoie la séquence inverse, mais quand il existe une méthode non-prolongement approprié , il est toujours choisie de préférence à une méthode d'extension. De plus, dans le cas LINQ, cela devrait être:

return someSequence.Reverse().ToList();
Marc Gravell
la source
1
FYI pour ceux qui veulent inverser un tableau, cela ne fonctionne pas, vous devez appeler Array.Reverse (array) à la place.
Iain Ward
10
Je viens de souffrir d'un cas particulier intéressant: lorsqu'une variable est déclarée comme List<int> list, alors list.Reverse()appelle la version en 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 IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)surcharge de fonction est utilisée, et cela passe inaperçu - vous devriez surveiller la valeur de retour inutilisée, et cela est rarement pratiqué en C #
Cee McSharpface
102

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

Mafu Josh
la source
1
c'est bien et fonctionne dans mon cas (laissez la liste d'origine intacte)! merci
ghiboz
20

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

Kieren Johnstone
la source
8

Reverse()ne retourne pas la liste inversée elle-même, il modifie la liste d'origine. Alors réécrivez-le comme suit:

return NavItems.Reverse(); 

À

NavItems.Reverse(); 
return NavItems;
sll
la source
6

Reverse() ne renvoie pas une liste comme prévu de votre fonction.

NavItems.Reverse();
return NavItems;
JK.
la source
Et comme il retourne void, vous ne pouvez pas l'affecter à rev.
Flagbug
3

.Reverse inverse le "sur place" ..., essayez

NavItems.Reverse();
return NavItems;
Yahia
la source
2

Si vous avez une liste comme dans votre exemple:

List<Lite.CategoryNavItem> NavItems

Vous pouvez utiliser la méthode générique des extensions Reverse <> pour renvoyer une nouvelle liste sans modifier la liste d'origine. Utilisez simplement la méthode d'extension comme celle-ci:

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

Remarques: Vous devez spécifier les balises génériques <> pour utiliser explicitement la méthode d'extension. N'oubliez pas le

using System.Linq;
MLH
la source