我有一个问题,我无法逆转以下内容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。它会更改您的原始列表。
反转整个
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>
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)
{
...
}
}