47

首先,我知道List<>框架中已经有一些通用类的方法可以遍历List<>.

但是作为一个例子,编写 ForEach 方法来迭代 a 的每个对象List<>并在每个对象上执行 a的正确语法是什么Console.WriteLine(object.ToString())。将List<>λ 作为第一个参数,将 lambda 表达式作为第二个参数的东西。

我见过的大多数示例都是作为扩展方法完成的,或者涉及 LINQ。我正在寻找一个普通的方法示例。

4

7 回答 7

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

...并这样称呼它:

Each(myList, i => Console.WriteLine(i));
于 2008-12-04T00:11:13.540 回答
50

这是你要求的吗?

int[] numbers = { 1, 2, 3 };
numbers.ToList().ForEach(n => Console.WriteLine(n));
于 2011-11-25T21:47:56.583 回答
41

上面的代码也可以用更少的代码写成:

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

这将创建一个通用列表并使用 IEnumerable 填充它,然后调用列表对象 ForEach。

于 2009-07-01T15:52:29.640 回答
13
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; });
于 2013-04-25T11:22:43.573 回答
4

想要说明的是,如果有人将答案作为扩展方法提供,则不必担心,因为扩展方法只是调用实例方法的一种很酷的方法。我了解您在不使用扩展方法的情况下想要答案。无论该方法是定义为静态、实例还是扩展,结果都是一样的。

下面的代码使用接受的答案中的代码来定义扩展方法和实例方法,并创建一个单元测试以显示输出是相同的。

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);
    }
 }
于 2013-10-30T02:35:44.283 回答
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”));
}
于 2009-08-21T09:05:36.057 回答
0

标准:

foreach (Item i in allItems)
{
   i.FK_ItemStatus_CustomCodeID = itemStatuses.Where(
      x => x.CustomCodeID == i.ItemStatus_CustomCodeID).FirstOrDefault();                        
}

拉姆达:

allItems.ForEach(
   i => i.FK_ItemStatus_CustomCodeID = 
      itemStatuses.Where(
         x => x.CustomCodeID == i.ItemStatus_CustomCodeID).FirstOrDefault()
      );
于 2022-02-27T18:59:31.850 回答