如何在foreach中反转列表?

时间:2013-02-26 10:14:28

标签: c# list

我遇到了问题,我无法撤销以下List

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

我总是得到错误:

  

类型void不可枚举

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

6 个答案:

答案 0 :(得分:34)

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

如果你想使用LINQ version of 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))
    {
        ...
    }
}

答案 1 :(得分:16)

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

答案 2 :(得分:4)

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

Reverse更改列表中的顺序 - 它不会返回具有相反项目顺序的新列表。

答案 3 :(得分:4)

List<T>.Reverse()就地反向,它不会返回新列表。它会更改您的 orininal 列表。

  

撤销整个List<T>中元素的顺序。

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

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

这是 DEMO

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

  

反转序列中元素的顺序。

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

使用Enumerable.Reverse<T>方法时, DEMO 相同。

答案 4 :(得分:3)

List<T>.Reverse不要归还任何东西!

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

    }

}

答案 5 :(得分:2)

List.Reverse()是一个带有void签名的方法。

您可以更改循环,如下所示。

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