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

これがなぜなのか、何かアイデアはありますか?

回答:


143

試してください:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()あるインプレース逆は。新しいリストは返しません。

これ、逆のシーケンスをReverse() 返す LINQと対照的ですが、適切な非拡張メソッドがある場合は、常に拡張メソッドよりも優先して選択されます。さらに、LINQの場合は次のようにする必要があります。

return someSequence.Reverse().ToList();

1
配列を逆にしたい人のための参考までに、これは機能しません、代わりにArray.Reverse(array)を呼び出す必要があります。
Iain Ward

10
変数が宣言されています。ただ、興味深い特殊なケースに苦しんでList<int> list、その後、list.Reverse()インプレースバージョンを呼び出します。次に、他の開発者は非常に賢く、宣言をに変更しIList<int>ます。この休憩非常に予想外の方法で、コードが、その後ので、関数IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)のオーバーロードが使用され、これは気付かれない-あなたは、未使用の戻り値を監視しなければならない、とそれはほとんどC#で実践されていない
シーMcSharpface

102

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


1
それは良いことであり、私の場合には機能します(元のリストはそのままにしておきます)!ありがとう
ghiboz


8

Reverse()元に戻されたリスト自体は返さず、元のリストを変更します。したがって、次のように書き直してください。

return NavItems.Reverse(); 

NavItems.Reverse(); 
return NavItems;

6

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

NavItems.Reverse();
return NavItems;

また、voidを返すため、revに割り当てることはできません。
Flagbug 2011

3

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

NavItems.Reverse();
return NavItems;

2

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

List<Lite.CategoryNavItem> NavItems

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

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

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

using System.Linq;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.