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?

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

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


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.


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;

6

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

NavItems.Reverse();
return NavItems;

Dan karena mengembalikan batal, Anda tidak dapat menetapkannya ke rev.
Flagbug

3

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

NavItems.Reverse();
return NavItems;

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.