如何在foreach中反转列表?

gur*_*gui 9 c# list

我有一个问题,我无法扭转以下情况List:

foreach (List<Foo> row in Items) 
{
    foreach (Foo item in row.Reverse())
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我总是得到错误:

类型void不可枚举

问题是什么以及如何解决?

Jon*_*eet 34

List<T>.Reverse不会返回任何内容 - 它会将列表反转到位.

如果您想使用LINQ版本Reverse返回相反的序列但改变现有列表,您可以使用:

foreach (IEnumerable<Foo> row in Items) 
{
    foreach (Foo item in row.Reverse())
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

或许更清楚:

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))
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*rth 16

List<T>.Reverse()确实的就地反向.这意味着它会更改您的原始列表.

所以,你会像这样使用它:

foreach (List<Foo> row in Items) 
{
    row.Reverse();
    foreach (Foo item in row)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不想更改原始列表,则必须Enumerable.Reverse明确调用:

foreach (List<Foo> row in Items) 
{
    foreach (Foo item in Enumerable.Reverse(row))
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

无法Enumerable.Reverse在扩展方法语法中使用的原因是:扩展方法不隐藏/覆盖实例方法,并且List<T>恰好已经有了Reverse方法.

  • 用于强调原始列表的+1被*改变*因此*在程序的不同部分是*并且保持颠倒*. (3认同)

Son*_*nül 5

List<T>.Reverse()就地反转,它不会返回新的 list。它会改变你原来的清单。

反转整个 中元素的顺序List<T>

您需要row.Reverse();在第一个 foreach 语句中使用。喜欢;

foreach (List<Foo> row in Items) 
{
    row.Reverse();
    foreach (Foo item in row)
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个演示

如果您不想更改原始列表,可以使用Enumerable.Reverse方法代替。

反转序列中元素的顺序。

foreach (Foo item in Enumerable.Reverse(row))
{
    //
}
Run Code Online (Sandbox Code Playgroud)

这里是使用方法相同的DEMOEnumerable.Reverse<T>