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++;
}
我想出了一个添加计数器变量的想法,然后使用该计数器访问该元素。这是最好的方式吗?
答案 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