我有一个这样的清单:
List<Thing> foo = new List<Thing>();
foo.PopulateWithFourThings();
我想反复遍历它,例如0123012301230123 ......
Foreach不是我想要的,因为我不想一切都在同一时间。我一直在搞乱队列,我想知道队列在这里是否合适?或者如果有比Queues更好的东西。
我正在寻找这种情况下最好的代码练习(反复遍历列表)。
那么有更好的选择:
if (nextElementIsNeeded)
{
Thing thing = foo[0];
foo.RemoveAt(0);
foo.Add(thing);
return thing;
}
或使用队列的以下代码:
Queue<Thing> foo = new Queue<Thing>();
foo.PopulateWithForThings();
//////////////////////////////////////
if (nextElementIsNeeded)
{
Thing thing = foo.Dequeue();
foo.Enqueue(thing);
return thing;
}
答案 0 :(得分:5)
不是不断向集合中添加和删除相同的项目(无论哪种类型),只需使用循环索引即可访问您拥有的列表。
int currentElementIndex = 0;
//..
if (nextElementIsNeeded)
{
currentElementIndex = (currentElementIndex + 1) % foo.Count;
thing = foo[currentElementIndex];
}
答案 1 :(得分:1)
不确定实用性,但这是一种扩展方法:
public static IEnumerable<T> SelectForever<T>(this IEnumerable<T> source)
{
while(true)
foreach(T item in source)
yield return item;
}
或添加投影:
public static IEnumerable<TResult> SelectForever<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
while(true)
foreach(TSource item in source)
yield return selector(item);
}
用法是:
foreach(Thing item in foo.SelectForever())
{
...hopefully break at some point
}
或
foreach(string s in foo.SelectForever(item => item.ToString()))
{
...hopefully break at some point
}
请注意,由于延迟执行,这只是 - 调用foo.SelectForever().ToList()
会一直运行,直到内存不足为止。