c# – Linq – lookahead迭代

c# – Linq – lookahead迭代,第1张

概述我通过使用访问者类型模式的集合来迭代,需要访问列表中的当前和下一个项目.目前我正在通过这样的扩展方法来做 public void Visit<TItem>(this IEnumerable<TItem> theList, Action<TItem, TItem> visitor){ for (i = 0; i <= theList.Count - 1; i++) { if 我通过使用访问者类型模式的集合来迭代,需要访问列表中的当前和下一个项目.目前我正在通过这样的扩展方法来做
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迭代所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1261557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存