c # Próba odwrócenia listy

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

Odwrotna nie działa:

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

Jakieś pomysły, dlaczego tak może być?

Tom Gullen
źródło

Odpowiedzi:

143

Próbować:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()jest odwróceniem w miejscu ; nie zwraca nowej listy.

To robi kontrast do LINQ, gdzie Reverse() powraca odwrotnej kolejności, ale gdy istnieje odpowiednia metoda non-extension jest zawsze wybrany zamiast do metodę rozszerzenia. Dodatkowo w przypadku LINQ musiałoby to być:

return someSequence.Reverse().ToList();
Marc Gravell
źródło
1
FYI dla tych, którzy chcą odwrócić tablicę, to nie działa, zamiast tego należy wywołać Array.Reverse (array).
Iain Ward,
11
Wystąpił tylko interesujący przypadek specjalny: kiedy zmienna jest zadeklarowana jako List<int> list, list.Reverse()wywołuje wersję lokalną. Następnie inny programista jest wyjątkowo inteligentny i zmienia deklarację na IList<int>. To łamie kod w bardzo nieoczekiwany sposób, ponieważ wtedy IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)używane jest przeciążenie funkcji , a to pozostaje niezauważone - musiałbyś uważać na nieużywaną wartość zwracaną, co jest rzadko praktykowane w C #
Cee McSharpface
103

Jednym obejściem byłoby Return NavItems.AsEnumerable().Reverse();

Mafu Josh
źródło
1
to dobrze i działa w moim przypadku (oryginalną listę pozostaw nietkniętą)! dzięki
ghiboz
20

.Reverse() na liście odwraca pozycje na liście, nie zwraca nowej odwróconej listy.

Kieren Johnstone
źródło
8

Reverse()nie zwraca samej odwróconej listy, modyfikuje oryginalną listę. Więc przepisz to w następujący sposób:

return NavItems.Reverse(); 

DO

NavItems.Reverse(); 
return NavItems;
sll
źródło
6

Reverse() nie zwraca listy zgodnie z oczekiwaniami Twojej funkcji.

NavItems.Reverse();
return NavItems;
JK.
źródło
A ponieważ zwraca void, nie możesz go przypisać do rev.
Flagbug
3

.Reverse odwraca działanie „w miejscu” ... spróbuj

NavItems.Reverse();
return NavItems;
Yahia
źródło
2

Jeśli masz listę taką jak w przykładzie:

List<Lite.CategoryNavItem> NavItems

Możesz użyć ogólnej metody rozszerzeń Reverse <>, aby zwrócić nową listę bez modyfikowania oryginalnej. Po prostu użyj następującej metody rozszerzenia:

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

Uwagi: Aby jawnie używać metody rozszerzenia, należy określić tagi ogólne <>. Nie zapomnij o

using System.Linq;
MLH
źródło