我有一个类型为Breadcrumb的IList,它只是一个具有NavigationTitle,NavigationUrl和IsCurrent属性的轻量级类.它缓存在网络服务器上.我有一个方法可以构建当前的痕迹路径,直到第一个将IsCurrent设置为true的Breadcrumb ...使用下面的代码.它非常难看,绝对是一个快速的解决方案,但我很好奇,这可以很容易地重构为LINQ吗?
IListcrumbs = new List (); bool foundCurrent = false; for (int a = 0; a < cachedCrumbs.Count; a++) { crumbs.Add(crumbs[a]); if (foundCurrent) { break; } foundCurrent = (crumbs[a + 1] != null && ((Breadcrumb)crumbs[a + 1]).IsCurrent); }
Jon Skeet.. 5
我按照我的想法输入了这个,所以它显示了一个思路,只是一个答案.
你的来源只是cachedCrumbs
你想添加第一个确实有IsCurrent设置的crumb ,但之后什么都没有
TakeWhile听起来像是要走的路,但获得"之前的价值是IsCurrent"有点痛苦
我们可以使用闭包来有效地保存变量,以确定最后一个值是否设置了IsCurrent
我们可以做一些"无操作"选择,以使TakeWhile与是否继续进行分离
所以,我们最终得到:
bool foundCurrent = false; var crumbs = cachedCrumbs.TakeWhile(crumb => !foundCurrent) .Select(crumb => { foundCurrent = crumb == null || !crumb.IsCurrent; return crumb; });
我没有试过这个,但我认为它应该有用......可能有一个更简单的方法.
编辑:我认为实际上是一个直foreach循环是在这种情况下简单.说了这么多,你可以写一个表现得像TakeWhile除了它的另一个扩展方法也返回这引起了条件失败的元素.那就简单到了:
var crumbs = cachedCrumbs.NewMethod(crumb => crumb == null || !crumb.IsCurrent);
(我现在想不出这个方法的正确名称,因此NewMethod
!)
我按照我的想法输入了这个,所以它显示了一个思路,只是一个答案.
你的来源只是cachedCrumbs
你想添加第一个确实有IsCurrent设置的crumb ,但之后什么都没有
TakeWhile听起来像是要走的路,但获得"之前的价值是IsCurrent"有点痛苦
我们可以使用闭包来有效地保存变量,以确定最后一个值是否设置了IsCurrent
我们可以做一些"无操作"选择,以使TakeWhile与是否继续进行分离
所以,我们最终得到:
bool foundCurrent = false; var crumbs = cachedCrumbs.TakeWhile(crumb => !foundCurrent) .Select(crumb => { foundCurrent = crumb == null || !crumb.IsCurrent; return crumb; });
我没有试过这个,但我认为它应该有用......可能有一个更简单的方法.
编辑:我认为实际上是一个直foreach循环是在这种情况下简单.说了这么多,你可以写一个表现得像TakeWhile除了它的另一个扩展方法也返回这引起了条件失败的元素.那就简单到了:
var crumbs = cachedCrumbs.NewMethod(crumb => crumb == null || !crumb.IsCurrent);
(我现在想不出这个方法的正确名称,因此NewMethod
!)