c # Mencoba membalikkan daftar

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

Kebalikannya tidak berhasil:

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

Ada ide mengapa ini mungkin terjadi?

Tom Gullen
sumber

Jawaban:

143

Mencoba:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()adalah kebalikan di tempat ; itu tidak mengembalikan daftar baru.

Ini tidak berbeda dengan LINQ, di mana Reverse() mengembalikan urutan terbalik, tetapi ketika ada metode non-ekstensi yang sesuai itu selalu dipilih dalam preferensi untuk metode ekstensi. Plus, dalam kasus LINQ itu harus:

return someSequence.Reverse().ToList();
Marc Gravell
sumber
1
FYI bagi mereka yang ingin membalikkan array ini tidak berfungsi, Anda perlu memanggil Array.Reverse (array) sebagai gantinya.
Iain Ward
11
Baru saja mengalami kasus khusus yang menarik: Ketika sebuah variabel dideklarasikan sebagai List<int> list, maka list.Reverse()memanggil versi di tempat. Kemudian, sesama pengembang sangat cerdas dan mengubah deklarasi menjadi IList<int>. Ini memecah kode dengan cara yang sangat tidak terduga, karena kemudian fungsi IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)kelebihan beban digunakan, dan ini tidak diperhatikan - Anda harus memperhatikan nilai kembalian yang tidak digunakan, dan itu jarang dipraktikkan di C #
Cee McSharpface
103

Salah satu solusinya adalah Return NavItems.AsEnumerable().Reverse();

Mafu Josh
sumber
1
itu bagus dan berhasil dalam kasus saya (biarkan daftar asli tidak tersentuh)! terima kasih
ghiboz
20

.Reverse() pada daftar membalikkan item dalam daftar, itu tidak mengembalikan daftar terbalik yang baru.

Kieren Johnstone
sumber
8

Reverse()tidak mengembalikan daftar terbalik itu sendiri, itu mengubah daftar asli. Jadi tulis ulang sebagai berikut:

return NavItems.Reverse(); 

UNTUK

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

Reverse() tidak mengembalikan List seperti yang diharapkan dari fungsi Anda.

NavItems.Reverse();
return NavItems;
JK.
sumber
Dan karena mengembalikan batal, Anda tidak dapat menetapkannya ke rev.
Flagbug
3

.Reverse membalikkan "di tempat" ..., coba

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

Jika Anda memiliki daftar seperti di contoh Anda:

List<Lite.CategoryNavItem> NavItems

Anda dapat menggunakan metode ekstensi Reverse <> generik untuk mengembalikan daftar baru tanpa mengubah yang asli. Cukup gunakan metode ekstensi seperti ini:

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

Catatan: Anda perlu menentukan <> tag umum untuk secara eksplisit menggunakan metode ekstensi. Jangan lupakan

using System.Linq;
MLH
sumber