通过列表重复迭代

时间:2014-09-27 14:32:34

标签: c# list queue iteration repeat

我有一个这样的清单:

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;
    }

2 个答案:

答案 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()会一直运行,直到内存不足为止。