2008-12-04 76 views
31

首先,我知道有框架中已有的類List<>類的方法會迭代List<>C#語法 - Lambda表達式的示例 - 通用列表的ForEach()示例

但是作爲一個例子,寫一個ForEach方法迭代遍歷每個對象的每個對象List<>,並對每個對象執行Console.WriteLine(object.ToString())的正確語法是什麼。 將List<>作爲第一個參數,將lambda表達式作爲第二個參數。

我見過的大多數例子都是作爲擴展方法完成的,或者涉及到LINQ。我正在尋找一個簡單的方法示例。

回答

50
public void Each<T>(IEnumerable<T> items, Action<T> action) 
{ 
    foreach (var item in items) 
     action(item); 
} 

...正是如此稱呼它:

Each(myList, i => Console.WriteLine(i)); 
+0

冷卻。現在我所看到的Func <>語法在哪裏起作用? – BuddyJoe 2008-12-04 01:21:30

+11

Func <>委託是具有返回值的方法的通用委託。 Action <>委託是沒有返回值的方法的通用委託。這是唯一的區別。 – TheSoftwareJedi 2008-12-04 02:25:01

+1

所以在你的情況下,你不需要返回一些東西(從console.writeline - 所以動作就足夠了。 – TheSoftwareJedi 2008-12-04 02:25:37

26

以上也可以用更少的代碼寫成:

new List<SomeType>(items).ForEach(
    i => Console.WriteLine(i) 
); 

這將創建一個通用的列表,並與填充它IEnumerable然後調用列表對象ForEach。

0

您可以遍歷列表中的每個字符串,甚至可以使用單個語句在整個泛型中進行搜索,這使得搜索更容易。

public static void main(string[] args) 
{ 
List names = new List(); 

names.Add(「Saurabh」); 
names.Add("Garima"); 
names.Add(「Vivek」); 
names.Add(「Sandeep」); 

string stringResult = names.Find(name => name.Equals(「Garima」)); 
} 
22

這是你要求的嗎?

int[] numbers = { 1, 2, 3 }; 
numbers.ToList().ForEach(n => Console.WriteLine(n)); 
9
public static void Each<T>(this IEnumerable<T> items, Action<T> action) { 
foreach (var item in items) { 
    action(item); 
} } 

...正是如此稱呼它:

myList.Each(x => { x.Enabled = false; }); 
1

想要把在那裏,沒有什麼可擔心的,如果有人提供了一個答案作爲一個擴展的方法,因爲擴展方法只是調用實例方法的一種很酷的方式。我明白你想要的答案不使用擴展方法。無論方法被定義爲靜態,實例還是擴展 - 結果都是一樣的。

下面的代碼使用來自接受答案的代碼來定義擴展方法和實例方法,並創建單元測試以顯示輸出是相同的。

public static class Extensions 
{ 
    public static void Each<T>(this IEnumerable<T> items, Action<T> action) 
    { 
     foreach (var item in items) 
     { 
      action(item); 
     } 
    } 
} 

[TestFixture] 
public class ForEachTests 
{ 
    public void Each<T>(IEnumerable<T> items, Action<T> action) 
    { 
     foreach (var item in items) 
     { 
      action(item); 
     } 
    } 

    private string _extensionOutput; 

    private void SaveExtensionOutput(string value) 
    { 
     _extensionOutput += value; 
    } 

    private string _instanceOutput; 

    private void SaveInstanceOutput(string value) 
    { 
     _instanceOutput += value; 
    } 

    [Test] 
    public void Test1() 
    { 
     string[] teams = new string[] {"cowboys", "falcons", "browns", "chargers", "rams", "seahawks", "lions", "heat", "blackhawks", "penguins", "pirates"}; 

     Each(teams, SaveInstanceOutput); 

     teams.Each(SaveExtensionOutput); 

     Assert.AreEqual(_extensionOutput, _instanceOutput); 
    } 
} 

毫不誇張地說,你需要做的擴展方法轉換爲實例方法的唯一事情就是去掉static修改和方法的第一個參數。

此方法

public static void Each<T>(this IEnumerable<T> items, Action<T> action) 
{ 
    foreach (var item in items) 
    { 
     action(item); 
    } 
} 

變得

public void Each<T>(Action<T> action) 
{ 
    foreach (var item in items) 
    { 
     action(item); 
    } 
}