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.