逆向循环遍历foreach

3

有没有可能使foreach从结尾向开头迭代集合?

int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
    foreach (int i in fibarray)
    {
        System.Console.WriteLine(i);
    }

如何使用foreach反向显示?

2
顺便提一下,正确的斐波那契数列是 0、1、1、2... - i_am_jorf
7个回答

4
您可以使用 Reverse()
int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
foreach (int i in fibarray.Reverse())
{
    System.Console.WriteLine(i);
}

一般来说,foreach 必须支持对集合中项目的正向枚举,并能支持任何仅支持正向枚举的 IEnumerable。如果不想使用 Reverse(),您可以编写自己的优化实现,它可用于提供索引器的 IList


4
using System.Linq;

foreach (int i in fibArray.Reverse())

但是普通的for循环将更加高效:

for( int index = fibArray.Length - 1; index >= 0; --index ) {
    int i = fibArray[index];
    ...
}

2
foreach (int i in fibarray.Reverse<int>())
{
    System.Console.WriteLine(i);
}

0

0
简而言之,不行。你无法更改 foreach 的行为。如果你想在不返回新数组的情况下做到这一点(例如调用Reverse),请使用for循环。
int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
for (int i = fibarray.Length - 1; i > -1; i--) {
    Console.WriteLine(i);
}

虽然我错过了-1(哎呀),但是i--函数在这种情况下提供了与--i相同的结果。 - David Anderson
这就是我所提到的那个“差一”的问题。现在你只需要实际打印fibarray的内容,因为你已经将i的含义从元素值更改为了*索引* - Ben Voigt
这是一个反向for循环的示例。他可以在循环内部做任何想做的事情,所以我真的不明白你试图表达什么意思。 - David Anderson
1
顺便提一下, Reverse不会返回一个新的数组,而是返回一个反向遍历该数组的迭代器。我认为这只对非常非常大的数组很重要。 - Ben Voigt
我不确定我同意,因为底层框架创建了一个缓冲区,并以相反的顺序返回缓冲区,而不是原始源。 - David Anderson
显示剩余2条评论

0
不。请使用for,或在迭代之前修改您的集合以达到所需的顺序。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接