【问题标题】:lambda expressions improve cod [closed]lambda 表达式改进 cod [关闭]
【发布时间】:2014-07-24 16:25:47
【问题描述】:

我正在尝试改进自己的代码。我是 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 表达式来改进吗?

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

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

    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);
        }
    }
    

    【讨论】:

    • 你为什么要创建自己的稍差一点的 Where 的不通用版本?
    • @Servy 我认为其他答案足以涵盖到Where 的转换,所以我选择保留问题的代码结构。当然,这可以与其他答案结合使用foreach (var item in mylist.Where(i =&gt; !validator(i)))
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      不是真的。当 lambda 表达式和 LINQ 使代码更易于理解时,代码得到了改进。换句话说,如果最好将代码描述为声明性的,或者描述为从一个空间到另一个空间的映射,那么 LINQ 和 lambda 表达式可以让您的代码更具表现力。

      修改 BrandleyDotNet 的答案以获得更清晰的答案:

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

      但这真的对您的代码有帮助吗?不必要。 LINQ 的引入并没有为这种情况提供更多的表达方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多