Linq - 前瞻迭代

Sim*_*ods 9 c# linq iteration

我使用访问者类型模式通过集合进行迭代,并且需要访问列表中的当前和下一个项目.目前我正在通过像这样的扩展方法来做这件事

public void Visit<TItem>(this IEnumerable<TItem> theList, Action<TItem, TItem> visitor)
{
    for (i = 0; i <= theList.Count - 1; i++) {
        if (i == theList.Count - 1) {
            visitor(theList(i), null);
        } else {
            visitor(theList(i), theList(i + 1));
        }    
    }    
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有其他/更好/更优雅的方法来实现这一目标?目前我认为我只需要访问列表中的当前和下一个项目,但我想知道我是否可能遇到需要预测下一个'n'项目的情况.

Jon*_*eet 10

假设您使用的是.NET 4,您可以使用它Zip来完成同样的事情:

var query = original.Zip(original.Skip(1),
                         (current, next) => new { current, next });
Run Code Online (Sandbox Code Playgroud)

迭代序列两次.你目前的扩展方法的一个更好的替代方案(我认为不会起作用,顺便说一句,因为IEnumerable没有Count属性,而你试图调用theList方法也是如此......)将是这样的:

public static void Visit<TItem>(this IEnumerable<TItem> theList,
                         Action<TItem, TItem> visitor)
{
    TItem prev = default(TItem);
    using (var iterator = theList.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            return;
        }
        prev = iterator.Current;
        while (iterator.MoveNext())
        {
            TItem current = iterator.Current;
            visitor(prev, current);
            prev = current;
        }
    }
    visitor(prev, default(TItem)); // Are you sure you want this?
}
Run Code Online (Sandbox Code Playgroud)

更普遍的前瞻是比较棘手的,说实话......你想要某种循环缓冲区,我怀疑......可能是一个自定义集合.