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?

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

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


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.


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;

6

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

NavItems.Reverse();
return NavItems;

Et comme il retourne void, vous ne pouvez pas l'affecter à rev.
— Flagbug

3

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

NavItems.Reverse();
return NavItems;

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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.