11

問題があります。以下を元に戻すことはできませんList:

foreach (List<Foo> row in Items) 
{
    foreach (Foo item in row.Reverse())
    {
        ...
    }
}

私はいつもエラーが発生します:

タイプ void は列挙可能ではありません

問題とその解決方法は何ですか?

4

6 に答える 6

37

List<T>.Reverse何も返さない- リストをその場で逆にする。

逆のシーケンスを返すが、既存のリストを変更せずにLINQ バージョンReverseを使用する場合は、次を使用できます。

foreach (IEnumerable<Foo> row in Items) 
{
    foreach (Foo item in row.Reverse())
    {
        ...
    }
}

または、より明確に:

foreach (List<Foo> row in Items) 
{
    // We want to use the LINQ to Objects non-invasive
    // Reverse method, not List<T>.Reverse
    foreach (Foo item in Enumerable.Reverse(row))
    {
        ...
    }
}
于 2013-02-26T10:16:12.613 に答える
18

List<T>.Reverse()インプレースリバースを行います。つまり、元のリストが変更されます。

したがって、次のように使用します。

foreach (List<Foo> row in Items) 
{
    row.Reverse();
    foreach (Foo item in row)
    {
        ...
    }
}

元のリストを変更したくない場合は、Enumerable.Reverse明示的に呼び出す必要があります。

foreach (List<Foo> row in Items) 
{
    foreach (Foo item in Enumerable.Reverse(row))
    {
        ...
    }
}

拡張メソッドの構文で使用できない理由Enumerable.Reverseは次のとおりです: 拡張メソッドはインスタンス メソッドを隠したりオーバーライドしたりせず、List<T>たまたま既にメソッドを持っていますReverse

于 2013-02-26T10:16:13.400 に答える
4
foreach (List<Foo> row in Items) 
{
    row.Reverse()
    foreach (Foo item in row)
    {
        ...
    }
}

Reverseリスト内の順序を変更する - 項目の順序が逆になった新しいリストは返されません。

于 2013-02-26T10:16:13.867 に答える
4

List<T>.Reverse()インプレース逆であり、新しいリストを返しません。それはあなたの元のリストを変更します。

全体の要素の順序を逆にしますList<T>

row.Reverse();最初の foreach ステートメントで使用する必要があります。お気に入り;

foreach (List<Foo> row in Items) 
{
    row.Reverse();
    foreach (Foo item in row)
    {
        //
    }
}

ここにデモがあります。

元のリストを変更したくない場合は、代わりにEnumerable.Reverseメソッドを使用できます。

シーケンス内の要素の順序を反転します。

foreach (Foo item in Enumerable.Reverse(row))
{
    //
}

メソッドを使用した同じデモを次に示します。Enumerable.Reverse<T>

于 2013-02-26T10:17:24.863 に答える
3

List<T>.Reverse何も返さないでください!

foreach (IEnumerable<Foo> row in Items) 
{
    row.Reverse();
    foreach(Foo item in row)
    {

    }

}
于 2013-02-26T10:16:39.823 に答える
3

List.Reverse() は void シグネチャを持つメソッドです。

おそらく、以下のようにループを変更できます。

foreach (List<Foo> row in Items) 
{
    row.Reverse();
    foreach (Foo item in row)
    {
        ...
    }
}
于 2013-02-26T10:17:43.850 に答える