当前位置:  开发笔记 > 运维 > 正文

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

如何解决《这可以重构成漂亮的LINQ吗?》经验,为你挑选了1个好方法。

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

IList crumbs = 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!)



1> Jon Skeet..:

我按照我的想法输入了这个,所以它显示了一个思路,只是一个答案.

你的来源只是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!)

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有