2012-10-28 34 views
1

我有代碼:如何優化此代碼使用lambda表達式

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可以使用lambda表達式。

我不知道

回答

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 ',所以我會刪除它,謝謝。 –