c#尝试反向列表


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

反向操作不起作用:

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

任何想法为什么会这样?

Answers:


143

尝试:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()就地反向;它不会返回新列表。

确实与LINQ相反,后者Reverse() 返回反向序列,但是当有合适的非扩展方法时,总是优先选择扩展方法。另外,在LINQ情况下,必须为:

return someSequence.Reverse().ToList();

1
仅供参考,对于那些想要反转数组的对象,这是行不通的,您需要改为调用Array.Reverse(array)。
伊恩·沃德

10
只是遇到了一个有趣的特殊情况:当变量声明为时List<int> list,然后list.Reverse()调用就地版本。然后,同一个开发人员会更聪明,并将声明更改为IList<int>。这以一种非常意外的方式破坏了代码,因为随后使用了函数IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)重载,并且这种情况未被注意到-您将必须注意未使用的返回值,而这在C#中很少实行
Cee McSharpface

102

一种解决方法是 Return NavItems.AsEnumerable().Reverse();


1
很好,并且在我的情况下有效(保留原始列表不变)!谢谢
ghiboz


8

Reverse()不返回反向列表本身,而是修改原始列表。因此,将其重写如下:

return NavItems.Reverse(); 

NavItems.Reverse(); 
return NavItems;

6

Reverse() 没有返回您的函数期望的列表。

NavItems.Reverse();
return NavItems;

而且因为它返回void,所以不能将其分配给rev。
Flagbug

3

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

NavItems.Reverse();
return NavItems;

2

如果您的示例中有一个列表:

List<Lite.CategoryNavItem> NavItems

您可以使用通用的Reverse <>扩展方法来返回新列表,而无需修改原始列表。只需使用如下扩展方法:

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

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

using System.Linq;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.