我使用访问者类型模式通过集合进行迭代,并且需要访问列表中的当前和下一个项目.目前我正在通过像这样的扩展方法来做这件事
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)
更普遍的前瞻是比较棘手的,说实话......你想要某种循环缓冲区,我怀疑......可能是一个自定义集合.
| 归档时间: |
|
| 查看次数: |
2060 次 |
| 最近记录: |