c # Tentativo di invertire un elenco


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

Il contrario non funziona:

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

Qualche idea sul perché questo potrebbe essere?

Risposte:


143

Provare:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()è un'inversione sul posto ; non restituisce un nuovo elenco.

Questo fa differenza LINQ, dove Reverse() restituisce la sequenza inversa, ma quando v'è un metodo non adatto estensione è sempre selezionata a preferenza di un metodo di estensione. Inoltre, nel caso di LINQ dovrebbe essere:

return someSequence.Reverse().ToList();

1
Cordiali saluti, per coloro che vogliono invertire un array, questo non funziona, è necessario chiamare Array.Reverse (array) invece.
Iain Ward

10
Ho appena sofferto di un caso speciale interessante: quando una variabile viene dichiarata come List<int> list, quindi list.Reverse()chiama la versione sul posto. Quindi, un altro sviluppatore è molto intelligente e cambia la dichiarazione in IList<int>. Questo interrompe il codice in un modo molto inaspettato, perché quindi IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)viene utilizzato il sovraccarico della funzione e questo passa inosservato: dovresti guardare il valore di ritorno non utilizzato, e questo è raramente praticato in C #
Cee McSharpface

102

Una soluzione potrebbe essere Return NavItems.AsEnumerable().Reverse();


1
va bene e funziona nel mio caso (lascia inalterata la lista originale)! grazie
ghiboz

20

.Reverse() su un elenco inverte gli elementi all'interno dell'elenco, non restituisce un nuovo elenco invertito.


8

Reverse()non restituisce la lista invertita stessa, modifica la lista originale. Quindi riscrivilo come segue:

return NavItems.Reverse(); 

PER

NavItems.Reverse(); 
return NavItems;

6

Reverse() non restituisce un elenco come previsto dalla funzione.

NavItems.Reverse();
return NavItems;

E poiché ritorna void, non puoi assegnarlo a rev.
Flagbug

3

.Reverse inverte il "posto" ..., prova

NavItems.Reverse();
return NavItems;

2

Se hai una lista come nel tuo esempio:

List<Lite.CategoryNavItem> NavItems

È possibile utilizzare il metodo generico delle estensioni Reverse <> per restituire un nuovo elenco senza modificare quello originale. Usa semplicemente il metodo di estensione in questo modo:

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

Note: è necessario specificare i tag generici <> per utilizzare esplicitamente il metodo di estensione. Non dimenticare il file

using System.Linq;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.