如何在foreach中反转列表?

14

我有一个问题,无法反转以下 List

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

我总是遇到这个错误:

类型void不可枚举

问题出在哪里,如何解决?


根据这篇文章,最近的 .NET 版本似乎已更改了 Reverse 方法的签名:public static IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source); - hbulens
6个回答

38
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))
    {
        ...
    }
}

20

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 已经有了 Reverse 方法。

3
强调原始列表已经被更改,因此在程序的不同部分中它被且保持反转。+1 - Matthias Meid

5

List<T>.Reverse()是一种就地反转的方法,它不返回新列表。它会改变你的原始列表。

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

在第一个foreach语句中,您需要使用row.Reverse();。例如:

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> 方法。


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

Reverse可使列表中的项目更改顺序,但不会返回新的已颠倒顺序的列表。


3

List<T>.Reverse 方法不会返回任何东西!

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

    }

}

3

List.Reverse()是一个没有返回值的方法。

你可以尝试将你的循环改为以下形式。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接