lambda表达式改善了鳕鱼

时间:2014-07-24 16:25:48

标签: c# lambda

我正在尝试改进自己的代码。我是lambda表达式的新手。 我的代码:

protected void Process1(List<SomeClass>mylist)
{
                foreach(var item in mylist)
                {
                               if (!SomeClass.Validate(item))
                               {
                                               continue;
                               }
                               DoStuff(item);
                               DoMoreStuff(item);
                               DoEvenMoreStuff(item);
                }
}

protected void Process2(List<SomeClass>mylist)
{
                foreach(var item in mylist)
                {
                               if (!SomeClass.Validate(item) || item.Value == 0)
                               {
                                               continue;
                               }
                               DoStuff(item);
                               DoMoreStuff(item);
                               DoEvenMoreStuff(item);
                }
}

使用lambda表达式可以改进吗?

3 个答案:

答案 0 :(得分:0)

我会用if子句替换你的Where语句:

foreach (var item in mlist.Where(i => !SomeClass.Validate(i) || i.Value == 0))
{
   DoStuff(item);
   ...
}

根据这些功能的作用,它们也可以得到改进,但这是我从给出的内容中看到的唯一改进。

答案 1 :(得分:0)

  

使用lambda表达式可以改进吗?

不是真的。使用lambda表达式和LINQ改进了代码,使代码更容易理解。换句话说,如果代码最好被描述为声明性的,或者作为从一个空间到另一个空间的映射,LINQ和lambda表达式为您的代码提供了更强大的表达能力。

稍微更清晰地修改BrandleyDotNet的答案给出了:

var nonValidItems = mList.Where(item => !SomeClass.Validate(item) || item.Value == 0));
foreach (item in nonValidItems)
{
    DoStuff(item);
}

但这对您的代码有帮助吗?不必要。对于这样的案例,LINQ的引入并没有提供更多的表达方式。

答案 2 :(得分:0)

由于这些方法之间只有很小一部分代码不同,您可以通过传入执行验证的lambda并删除一些冗余代码来使用lambdas;

protected void Process1(List<SomeClass>mylist) {
    Process (mylist, item => !SomeClass.Validate (item));
}

protected void Process2(List<SomeClass>mylist) {
    Process (mylist, item => !SomeClass.Validate (item) || item.Value == 0);
}

private void Process(List<SomeClass>mylist, Func<SomeClass, bool> validator)
{
    foreach (var item in mylist) {
        if (validator (item)) {
            continue;
        }
        DoStuff (item);
        DoMoreStuff (item);
        DoEvenMoreStuff (item);
    }
}