c # Versuch, eine Liste umzukehren

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

Das Gegenteil funktioniert nicht:

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

Irgendwelche Ideen, warum das so sein könnte?

Tom Gullen
quelle

Antworten:

142

Versuchen:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()ist eine In-Place- Umkehrung; Es wird keine neue Liste zurückgegeben.

Dies tut Gegensatz zu LINQ, wo Reverse() gibt die umgekehrte Reihenfolge, aber wenn es eine geeignete nicht-Extension - Methode ist es immer bevorzugt auf eine Erweiterungsmethode ausgewählt. Außerdem müsste es im LINQ-Fall sein:

return someSequence.Reverse().ToList();
Marc Gravell
quelle
1
Zu Ihrer Information: Wenn Sie ein Array umkehren möchten, funktioniert dies nicht. Sie müssen stattdessen Array.Reverse (Array) aufrufen.
Iain Ward
10
Ich habe gerade unter einem interessanten Sonderfall gelitten: Wenn eine Variable als deklariert wird List<int> list, wird list.Reverse()die In-Place-Version aufgerufen. Dann ist ein Mitentwickler besonders schlau und ändert die Deklaration in IList<int>. Dies bricht den Code auf sehr unerwartete Weise, da dann die Funktionsüberladung IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)verwendet wird und dies unbemerkt bleibt - Sie müssten auf nicht verwendete Rückgabewerte
achten
102

Eine Problemumgehung wäre Return NavItems.AsEnumerable().Reverse();

Mafu Josh
quelle
1
Das ist gut und funktioniert in meinem Fall (lassen Sie die ursprüngliche Liste unberührt)! danke
ghiboz
20

.Reverse() Wenn eine Liste die Elemente in der Liste umkehrt, wird keine neue umgekehrte Liste zurückgegeben.

Kieren Johnstone
quelle
8

Reverse()Gibt die umgekehrte Liste selbst nicht zurück, sondern ändert die ursprüngliche Liste. Schreiben Sie es also wie folgt um:

return NavItems.Reverse(); 

ZU

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

Reverse() gibt keine Liste zurück, wie von Ihrer Funktion erwartet.

NavItems.Reverse();
return NavItems;
JK.
quelle
Und weil es void zurückgibt, können Sie es nicht rev zuweisen.
Flagbug
3

.Reverse kehrt das "In-Place" um ..., versuchen Sie es

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

Wenn Sie eine Liste wie in Ihrem Beispiel haben:

List<Lite.CategoryNavItem> NavItems

Sie können die generische Reverse <> -Erweiterungsmethode verwenden, um eine neue Liste zurückzugeben, ohne die ursprüngliche zu ändern. Verwenden Sie einfach die Erweiterungsmethode wie folgt:

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

Hinweise: Sie müssen die generischen <> Tags angeben, um die Erweiterungsmethode explizit verwenden zu können. Vergiss das nicht

using System.Linq;
MLH
quelle