这可以重构成漂亮的LINQ吗?

Evi*_*Syn 1 linq refactoring

我有一个类型为Breadcrumb的IList,它只是一个具有NavigationTitle,NavigationUrl和IsCurrent属性的轻量级类.它缓存在网络服务器上.我有一个方法可以构建当前的痕迹路径,直到第一个将IsCurrent设置为true的Breadcrumb ...使用下面的代码.它非常难看,绝对是一个快速的解决方案,但我很好奇,这可以很容易地重构为LINQ吗?

IList<Breadcrumb> crumbs = new List<Breadcrumb>();
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);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 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; });
Run Code Online (Sandbox Code Playgroud)

我没有试过这个,但我认为它应该有用......可能有一个更简单的方法.

编辑:我认为实际上是一个直foreach循环在这种情况下简单.说了这么多,你可以写一个表现得像TakeWhile除了它的另一个扩展方法返回这引起了条件失败的元素.那就简单到了:

var crumbs = cachedCrumbs.NewMethod(crumb => crumb == null || !crumb.IsCurrent);
Run Code Online (Sandbox Code Playgroud)

(我现在想不出这个方法的正确名称,因此NewMethod!)