0

誰かが私を助けることができますか?私はラムダ式にあまり強くありません。

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

それが私がそれを成し遂げる方法です。

于 2012-10-24T21:05:28.260 に答える
3

2 番目のプロセスは、パラメーターを使用して最初のプロセスを呼び出すのと同じです。

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

できることの 1 つは、Linq を使用して検証をコレクションに適用し、有効なアイテムを返すことです。さらに、必要に応じて、それらをチェーンして複数の検証を適用することもできます。例えば:

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

これにより、検証に合格したアイテムだけのコレクションが返され、「実行」する必要がある「もの」をすべて適用できます。

于 2012-10-24T20:38:07.543 に答える
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 に答える
-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 に答える