2008-12-04 28 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); 
    } 
}