我遇到了问题,我无法撤销以下List
:
foreach (List<Foo> row in Items)
{
foreach (Foo item in row.Reverse())
{
...
}
}
我总是得到错误:
类型void不可枚举
问题是什么以及如何解决?
答案 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)
{
...
}
}