c # Cố gắng đảo ngược danh sách


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

Điều ngược lại không hoạt động:

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

Vài ý tưởng tại sao nó như thế?

Câu trả lời:


143

Thử:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()là một sự đảo ngược tại chỗ ; nó không trả về một danh sách mới.

Điều này trái ngược với LINQ, nơi Reverse() trả về trình tự đã đảo ngược, nhưng khi có một phương thức không mở rộng phù hợp, nó luôn được chọn thay vì một phương thức mở rộng. Ngoài ra, trong trường hợp LINQ, nó sẽ phải là:

return someSequence.Reverse().ToList();

1
FYI đối với những người muốn đảo ngược một mảng, điều này không hoạt động, bạn cần gọi Array.Reverse (mảng) để thay thế.
Iain Ward

10
Chỉ bị một trường hợp đặc biệt thú vị: Khi một biến được khai báo là List<int> list, sau đó list.Reverse()gọi phiên bản tại chỗ. Sau đó, một nhà phát triển đồng nghiệp cực kỳ thông minh và thay đổi khai báo thành IList<int>. Phá vỡ này mã một cách rất bất ngờ, bởi vì khi đó các chức năng IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)quá tải được sử dụng, và điều này đi không được chú ý - bạn sẽ phải xem cho giá trị trả về không sử dụng, và hiếm khi được thực hiện trong C #
Cee McSharpface

102

Một cách giải quyết sẽ là Return NavItems.AsEnumerable().Reverse();


1
điều đó tốt và hoạt động trong trường hợp của tôi (để nguyên danh sách ban đầu)! cảm ơn
ghiboz

20

.Reverse() trên một danh sách đảo ngược các mục trong danh sách, nó không trả về một danh sách đảo ngược mới.


8

Reverse()không tự trả về danh sách đã đảo ngược, nó sửa đổi danh sách ban đầu. Vì vậy, hãy viết lại nó như sau:

return NavItems.Reverse(); 

ĐẾN

NavItems.Reverse(); 
return NavItems;

6

Reverse() không trả về một Danh sách như mong đợi của chức năng của bạn.

NavItems.Reverse();
return NavItems;

Và vì nó trả về void nên bạn không thể gán nó cho rev.
Flagbug

3

.Reverse đảo ngược "tại chỗ" ..., hãy thử

NavItems.Reverse();
return NavItems;

2

Nếu bạn có một danh sách như trong ví dụ của mình:

List<Lite.CategoryNavItem> NavItems

Bạn có thể sử dụng phương pháp Reverse <> extension chung để trả về danh sách mới mà không cần sửa đổi danh sách ban đầu. Chỉ cần sử dụng phương thức mở rộng như sau:

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

Lưu ý: Bạn cần chỉ định các thẻ chung chung <> để sử dụng phương pháp mở rộng một cách rõ ràng. Đừng quên

using System.Linq;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.