我有一个List<T>
我需要撤消,所以我尝试了:
foreach (Round round in Competition.Rounds.Reverse())
{
}
返回以下错误:
the foreach statement can not work with variables of type 'void'
because 'void' does not contain a public instance definition for 'GetEnumerator'
我该如何解决这个问题?
答案 0 :(得分:7)
需要考虑两种Reverse
方法:
List<T>.Reverse()
就地反转列表,但返回类型为void
。Enumerable.Reverse<T>()
不修改数据源,但返回反向&#34;视图&#34;数据。编译器只在其耗尽的实例方法之后才查找扩展方法 - 所以在这种情况下,它绑定到List<T>.Reverse()
方法......这就是它的原因所在没有编译。 (你不能迭代void
。)
如果要修改列表,只需单独调用该方法:
Competition.Rounds.Reverse();
foreach (Round round in Competition.Rounds)
{
...
}
如果您不想想要修改列表,最简单的方法可能就是直接致电Enumerable.Reverse<T>
:
foreach (Round round in Enumerable.Reverse(Competition.Rounds))
{
...
}
或者你可以有效地失去&#34;编译时类型List<T>
,例如像这样:
// Important: don't change the type of rounds to List<Round>
IEnumerable<Round> rounds = Competition.Rounds;
foreach (Round round in rounds.Reverse())
{
...
}
答案 1 :(得分:2)
反向返回void,而不是:
Competition.Rounds.Reverse();
foreach (Round round in Competition.Rounds){...}
或者如果您不想修改Competition.Rounds
,请使用Enumerable.Reverse(...)
:
foreach (Round round in Enumerable.Reverse(Competition.Rounds)){...}
或效率较低的替代方案:
foreach (String round in Competition.Rounds.ToArray().Reverse()){...}