【问题标题】:c# Trying to reverse a listc# 试图反转一个列表
【发布时间】:2011-10-22 06:38:29
【问题描述】:

我有以下代码:

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&lt;Lite.CategoryNavItem&gt;'

任何想法为什么会这样?

【问题讨论】:

    标签: c# list reverse


    【解决方案1】:

    试试:

    NavItems.Reverse();
    return NavItems;
    

    List&lt;T&gt;.Reverse() 是一个 in-place 反向;它不会返回新列表。

    确实与 LINQ 对比,其中Reverse() 返回相反的序列,但是当有合适的非扩展方法时它总是 strong> 优先于扩展方法选择。另外,在 LINQ 的情况下,它必须是:

    return someSequence.Reverse().ToList();
    

    【讨论】:

    • 仅供参考,对于那些想要反转数组的人,这不起作用,您需要改为调用 Array.Reverse(array)。
    • 刚刚遇到一个有趣的特殊情况:当变量声明为List&lt;int&gt; list 时,list.Reverse() 调用就地版本。然后,一位开发人员非常聪明,将声明更改为IList&lt;int&gt;。这会以一种非常出乎意料的方式破坏代码,因为随后使用了函数 IEnumerable&lt;TSource&gt; Reverse&lt;TSource&gt;(this IEnumerable&lt;TSource&gt; source) 重载,而这不会被注意到 - 您必须注意未使用的返回值,而这在 C# 中很少实践
    【解决方案2】:

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

    【讨论】:

    • 这很好,适用于我的情况(保持原始列表不变)!谢谢
    【解决方案3】:

    列表上的.Reverse() 反转列表中的项目,它不返回新的反转列表。

    【讨论】:

      【解决方案4】:

      Reverse() 本身不返回反向列表,它会修改原始列表。于是改写如下:

      return NavItems.Reverse(); 
      

      NavItems.Reverse(); 
      return NavItems;
      

      【讨论】:

        【解决方案5】:

        Reverse() 没有按照您的函数的预期返回 List。

        NavItems.Reverse();
        return NavItems;

        【讨论】:

        • 而且因为它返回 void,所以不能将它分配给 rev。
        【解决方案6】:

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

        List<Lite.CategoryNavItem> NavItems
        

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

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

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

        using System.Linq;
        

        【讨论】:

        • 我认为最后缺少一个 .ToList() 。 List 反转 = NavItems.Reverse().ToList();
        【解决方案7】:

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

        NavItems.Reverse();
        return NavItems;
        

        【讨论】:

          【解决方案8】:

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

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

          你可以试试Enumerable.Reverse(someList)

          别忘了:

          using System.Linq;
          

          【讨论】:

          • 完美运行。谢谢!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多