2012-10-28 2 views
1

У меня есть код:Как оптимизировать этот код использовать лямбда-выражения

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

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

как организовать эти два метода?

у них есть разница только item.Value == 0 может использовать выражения лямбда.

Я понятия не имею,

ответ

1
protected void Method(List<SomeClass> mylist, Func<SomeClass, bool> filter) 
{ 
    var selectedItem = mylist.Where(filter); 

    foreach (var item in selectedItem) 
     DoStuff(item); 
} 

Таким образом, вы можете использовать:

Method(mylist, item => (SomeClass.Validate(item) && item.Value != 0)); 

Или:

Method(mylist, item => SomeClass.Validate(item)); 
+1

+1, я хотел написать это как мое второе решение :) Но я думаю, что будет лучше, если вы будете писать 'mylist.Where (фильтр). ForEach (DoStuff) ' –

+1

Подождите, ваше решение делает вещи для неправильных предметов. Вам нужно переписать фильтры –

+0

@RomanPekar, вы НЕ можете писать 'mylist.Where (filter) .ForEach (DoStuff)' потому что .ForEach() - это метод 'List', а не' IEnumerable', если вам нужно, напишите: ' mylist.Where (filter) .ToList(). ForEach (i => DoStuff (i)) ' –

0

Если я понимаю, что вам нужно, то код должен выглядеть следующим образом ,

protected void CommonMethod(List<SomeClass> mylist, Func<SomeClass, bool> predicate) 
{ 
    foreach(var item in mylist) 
    { 
     if (predicate(item)) 
     { 
      continue; 
     } 
     DoStuff(item); 
    } 
} 

Func<SomeClass, bool> method1Predicate = (SomeClass item) => !SomeClass.Validate(item); 
Func<SomeClass, bool> method2Predicate = (SomeClass item) => !SomeClass.Validate(item) || item.Value == 0; 
0

насчет:

protected void Method<T>(List<T> mylist, Func<T, bool> predicate) 
{ 
    var result = mylist.Where(predicate); 

    foreach(var item in result) 
     DoStuff(item); 
} 
+0

почему' ToList() '? – Adam

+0

Это не обязательно, запрос возвращает 'IEnumerable ', поэтому я удалю его, спасибо. –

Смежные вопросы