我如何使用lambda表达式改进代码?

时间:2012-10-24 20:30:06

标签: c# linq lambda refactoring

有人可以帮助我吗?我对lambda表达式并不是很强。

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

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

6 个答案:

答案 0 :(得分:3)

第二个过程与使用参数

调用第一个过程相同
myList.Where(item => item.Value != 0)

或者,如果您需要两种方法:

protected void Process1(IEnumerable<SomeClass> mylist)
{
    foreach (var item in mylist)
    { 
        if (!SomeClass.Validate(item))        
            continue;

        DoStuff(item);
        DoMore(item);
        DoEven(item); 
    }
}

protected void Process2(IEnumerable<SomeClass> mylist)
{
    Process1(myList.Where(item => item.Value != 0));
}

另外,我已将输入参数更改为IEnumerable(因为您只迭代项目序列)。

答案 1 :(得分:3)

protected void Process1(List<SomeClass> mylist)
{
    foreach (var item in mylist.Where(item => SomeClass.Validate(item))
    {
        DoStuff(item); 
        DoMore(item); 
        DoEven(item);
    }
}

protected void Process2(List<SomeClass> mylist)
{
    foreach (var item in mylist.Where(item => item.Value != 0 && SomeClass.Validate(item))
    { 
        DoStuff(item);
        DoMore(item);
        DoEven(item); 
    }
}

我就是这样做的。

答案 2 :(得分:1)

你的意思是这样的吗?

protected void Process(List<SomeClass> mylist, List<Action<SomeClass>> actions)
{
    foreach (var item in mylist)
    {
        if (!SomeClass.Validate(item)) 
        { 
            continue; 
        }
        foreach(var action in actions) 
            action(item); 
    }
}

然后用:

来调用它
Process(list, new List<Action<SomeClass>> {DoStuff, DoMore, DoEven});

答案 3 :(得分:0)

您可以做的一件事是使用Linq将验证应用于集合并返回有效的项目。此外,如果需要,您可以将它们链接在一起以应用多个验证。例如:

return myList.Where(item -> !SomeClass.Validate(item))
             .Where(item -> !OtherClass.Validate(item))

这将返回仅通过验证的项目的集合,您可以应用“do”所需的任何“内容”。

答案 4 :(得分:0)

Process方法可以非常通用且可重复使用:

void Process<T>(IEnumerable<T> source, Predicate<T> filter, Action<T> action)
{
    foreach (var item in source)
        if (filter(item))
            action(item);
}

然后你将使用它,例如,像这样:

Process(
    list, 
    i => SomeClass.Validate(i) && i.Value != 0, 
    i => 
    {
        DoStuff(i);
        DoMore(i);
        DoEven(i);
    });

答案 5 :(得分:-1)

我不是开始传递名单的忠实粉丝,但是......

protected void Process1(List<SomeClass> myList)
{
    myList.Where(item => SomeClass.Validate(item)).ToList()
        .ForEach(item =>
        {
            DoStuff(item);
            DoMore(item);
            DoEven(item);
        });
}

protected void Process2(List<SomeClass> myList)
{
    myList.Where(item => SomeClass.Validate(item) && item.Value != 0).ToList()
        .ForEach(item =>
        {
            DoStuff(item);
            DoMore(item);
            DoEven(item);
        });
}