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?

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

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


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.


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;

6

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

NavItems.Reverse();
return NavItems;

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;

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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.