在foreach循环中访问Next Element

时间:2014-08-05 07:35:27

标签: c#

int i = 0;    
foreach (var logInAlarm in logInAlarms)
 {
//Custom Code
//For comparison reason i need to access the next logInAlarm in the list.
 var nextDate = logInAlarms[i + 1].Date;
i++;
}

我想出了一个添加计数器变量的想法,然后使用该计数器访问该元素。这是最好的方式吗?

2 个答案:

答案 0 :(得分:4)

你最好使用现有的for循环来阻止越界错误,但你的方法或多或少是正确的

for(int i = 0; i < logInAlarms.Length - 1; i++)
    var nextDate = logInAlarms[i+1].Date;

测试数组末尾的代码

    var arr = Enumerable.Range(0, 5).ToArray();
    for (int i = 0; i < arr.Length - 1; i++)
        Console.Write(arr[i]);

    Console.ReadLine();

答案 1 :(得分:3)

因为您正在处理具有接受整数的索引器属性的集合(例如数组或List<T>),所以您应该使用for循环。

for (int v = 1; v < logInAlarms.Length; v++)
{
    var current = logInAlarms[v - 1];
    var next = logInAlarms[v];

    // use current and next
}

但是,如果您没有处理数组或List<T>而是使用任何类型的IEnumerable作为foreach循环支持,我会使用这个更通用的代码。

var enumerator = logInAlarms.GetEnumerator();

if(enumerator.MoveNext())
{
    var current = enumerator.Current;

    while (enumerator.MoveNext())
    {
        var next = enumerator.Current;

        // use current and next

        current = next;
    }

    // current is now the last node, to which there is no "next." Deal with that or ignore it as you see so fit.
}

我再次建议这一点,只是因为它会在foreach的任何时候起作用,而for循环只会在某些情况下起作用(尽管ElementAt)。如果您可以使用for,请执行此操作,但如果您不能,则可以使用。

只是为了好玩,你甚至可以写一个辅助函数。如果您的原始类型实现了Enumerable.Cast<T>而不是IEnumerable,则需要使用IEnumerable<T>,但如果您执行此类操作,这仍然非常有用。我还在@JeppeStigNielsen的评论中实现了using块,你可能会也可能不想在第一个例子中执行此操作,具体取决于您的实现是否实现IEnumerable<T>而不是{ {1}}(无论如何都被逐步淘汰,几乎没有使用过。)

IEnumerable