0

有人能帮我吗?我对 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); 
    }
}
4

6 回答 6

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

That's how I would get it done.

于 2012-10-24T21:05:28.260 回答
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(因为您只遍历项目序列)。

于 2012-10-24T20:36:25.780 回答
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});
于 2012-10-24T20:37:28.713 回答
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);
    });
于 2012-10-24T21:03:22.300 回答
0

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

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

这将返回仅通过验证的项目的集合,您可以在其中应用您需要“做”的任何“东西”。

于 2012-10-24T20:38:07.543 回答
-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);
        });
}
于 2012-10-24T20:38:10.637 回答