c# – Linq – lookahead迭代

前端之家收集整理的这篇文章主要介绍了c# – Linq – lookahead迭代前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我通过使用访问者类型模式的集合来迭代,需要访问列表中的当前和下一个项目.目前我正在通过这样的扩展方法来做
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));
        }    
    }    
}

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

解决方法

假设你使用的是.NET 4,你可以使用Zip来完成同样的事情:
var query = original.Zip(original.Skip(1),(current,next) => new { current,next });

这将遍历序列两次.一个更好的替代您当前的扩展方法(我不相信将工作,btw,因为IEnumerable没有Count属性,你正在尝试调用该列表作为一个方法…)将是一些东西喜欢:

public static void Visit<TItem>(this IEnumerable<TItem> theList,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?
}

更一般的前瞻是棘手的,说实话…你想要一些循环缓冲区,我怀疑…可能是一个自定义集合.

猜你在找的C#相关文章