我正在检查反射器中的代码,但还没有找到如何使它能够倒序枚举集合的方法?
因为没有计数信息,并且枚举始终从集合的“开始”处开始,对吗?
这是.NET框架的缺点吗?和常规枚举相比成本更高吗?
我正在检查反射器中的代码,但还没有找到如何使它能够倒序枚举集合的方法?
因为没有计数信息,并且枚举始终从集合的“开始”处开始,对吗?
这是.NET框架的缺点吗?和常规枚举相比成本更高吗?
public static IEnumerable<T> Reverse<T>(this IList<T> list) {
for (int i = list.Count - 1; i >= 0; i--) {
yield return list[i];
}
}
IEnumerable<TreeNode> Reverse(this TreeNodeCollection list)
。 - JackReverse()
扩展方法的返回类型与 List
的 Reverse()
返回类型不同,因此它无法编译。 - Gerard编辑:糟糕,我写错了反转测试,对于错误答案我深表歉意。经过更正测试(使用由 Reverse() 返回的可枚举对象),它确实会缓冲。
看起来 Reverse 扩展方法仅在集合已填充时才起作用。在使用 yield return 时,它不做任何事情。
在使用反转时遇到问题,认为它必须缓冲才能工作,发现它不能与 yield 一起使用。它只是跳过它而不执行任何操作。下面是我的测试代码。
[TestMethod]
public void loopTest()
{
var series = this.GetSeries();
series.Reverse();
foreach (var l in series)
{
Debug.WriteLine(l);
}
}
private IEnumerable<long> GetSeries()
{
var series = new List<long>() { 1, 2, 3, 4 };
foreach (var entry in series)
{
Debug.WriteLine(entry);
yield return entry;
}
}
不要反向调用GetSeries函数,所有在此论坛中的缓冲区似乎都是从空气中出现的。
series.Reverse();
没有任何效果。如果你将该行更改为 var reversed = series.Reverse();
然后迭代 reversed
,那么你将得到正确的答案。 - wageoghe