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.