問題があります。以下を元に戻すことはできませんList
:
foreach (List<Foo> row in Items)
{
foreach (Foo item in row.Reverse())
{
...
}
}
私はいつもエラーが発生します:
タイプ void は列挙可能ではありません
問題とその解決方法は何ですか?
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))
{
...
}
}
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
。
foreach (List<Foo> row in Items)
{
row.Reverse()
foreach (Foo item in row)
{
...
}
}
Reverse
リスト内の順序を変更する - 項目の順序が逆になった新しいリストは返されません。
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>
List<T>.Reverse
何も返さないでください!
foreach (IEnumerable<Foo> row in Items)
{
row.Reverse();
foreach(Foo item in row)
{
}
}
List.Reverse() は void シグネチャを持つメソッドです。
おそらく、以下のようにループを変更できます。
foreach (List<Foo> row in Items)
{
row.Reverse();
foreach (Foo item in row)
{
...
}
}