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。它会更改您的原始列表。

反转整个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))
{
    //
}

这是使用方法的相同DEMO 。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 回答