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# – Linq – lookahead迭代全部内容,希望文章能够帮你解决c# – Linq – lookahead迭代所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)