c# 尝试反转列表

问题描述 投票:0回答:9

我有以下代码:

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

但是我收到以下错误:

无法将类型“void”隐式转换为

'System.Collections.Generic.List<Lite.CategoryNavItem>'

有什么想法吗?

c# list reverse
9个回答
167
投票

尝试:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()
in-place 反转;它不会返回新列表。

确实与 LINQ 形成对比,其中

Reverse()
返回相反的序列,但是当存在合适的非扩展方法时,它始终优先于扩展方法选择。另外,在 LINQ 情况下,它必须是:

return someSequence.Reverse().ToList();
    

132
投票
一种解决方法是

Return NavItems.AsEnumerable().Reverse();


    


22
投票

.Reverse()

 会反转列表中的项目,但不会返回新的反转列表。


11
投票

Reverse()

本身不返回反转列表,它修改原始列表。所以重写如下:

return NavItems.Reverse();

NavItems.Reverse(); return NavItems;
    

6
投票

Reverse()

 不会按照您的函数预期返回列表。

NavItems.Reverse(); return NavItems;
    

5
投票
我遇到的情况是,所有建议的选项都不适合我。所以,如果你:

    不想使用
  • someList.Reverse()
    ,因为它什么也没有返回(
    void
    )
  • 不想使用
  • someList.Reverse()
    ,因为它修改了源列表
  • 使用
  • someList.AsEnumerable().Reverse()
     并得到 
    Ambiguous invocation
     错误

您可以尝试Enumerable.Reverse(someList)

不要忘记:

using System.Linq;
    

4
投票
如果您有一个像示例中那样的列表:

List<Lite.CategoryNavItem> NavItems

您可以使用通用的 Reverse<> 扩展方法返回一个新列表,而无需修改原始列表。只需使用这样的扩展方法即可:

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

注意:您需要指定 <> 通用标签才能显式使用扩展方法。 别忘了

using System.Linq;
    

3
投票

.Reverse

反转“就地”...,试试

NavItems.Reverse(); return NavItems;
    

0
投票
The overload code people are writing these days is overwhelming. Using enumerators and LINQ and so on... when a simple method can do this: public void Reverse<T>(List<T> list) { int last = list.Count - 1; int middle = list.Count >> 1; for (int i = 0; i < middle; i++) (list[i], list[last - i]) = (list[last - i], list[i]); }
    
© www.soinside.com 2019 - 2024. All rights reserved.