web-dev-qa-db-ja.com

c#リストを逆にしようとする

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>'

なぜこれが考えられるのか?

82
Tom Gullen

試してください:

_NavItems.Reverse();
return NavItems;
_

List<T>.Reverse()は、in-place逆です。新しいリストは返されません。

これはdoesLINQとは対照的で、Reverse()returns逆の順序ですが、適切な非拡張メソッドがある場合は、拡張メソッドよりも優先してalwaysが選択されます。さらに、LINQの場合は次のようにする必要があります。

_return someSequence.Reverse().ToList();
_
132
Marc Gravell

1つの回避策はReturn NavItems.AsEnumerable().Reverse();です

88
Mafu Josh

リストの.Reverse()は、リスト内のアイテムを反転します。新しい反転リストは返しません。

19

Reverse()は逆のリスト自体を返さず、元のリストを変更します。したがって、次のように書き換えます。

return NavItems.Reverse(); 

NavItems.Reverse(); 
return NavItems;
8
sll

Reverse()は、関数の期待どおりのリストを返しません。

NavItems.Reverse();
return NavItems;
6
JK.

.Reverse「インプレース」を逆にします...、試してください

NavItems.Reverse();
return NavItems;
3
Yahia

あなたの例のようなリストがある場合:

List<Lite.CategoryNavItem> NavItems

汎用のReverse <>拡張メソッドを使用して、元のリストを変更せずに新しいリストを返すことができます。次のような拡張メソッドを使用します。

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

注:拡張メソッドを明示的に使用するには、<>汎用タグを指定する必要があります。忘れないで

using System.Linq;
2
MLH