Синтаксис C # - Пример лямбда-выражения - ForEach () в общем списке - PullRequest
34 голосов
/ 04 декабря 2008

Во-первых, я знаю, что в базовом классе List<> уже есть методы, которые уже находятся в фреймворке, итерируют по List<>.

Но в качестве примера, каков правильный синтаксис для написания метода ForEach для итерации по каждому объекту List<> и выполнения Console.WriteLine(object.ToString()) для каждого объекта. Нечто, принимающее List<> в качестве первого аргумента и лямбда-выражение в качестве второго аргумента.

Большинство примеров, которые я видел, сделаны как методы расширения или включают LINQ. Я ищу простой старый пример метода.

Ответы [ 6 ]

55 голосов
/ 04 декабря 2008
public void Each<T>(IEnumerable<T> items, Action<T> action)
{
    foreach (var item in items)
        action(item);
}

... и назовите это так:

Each(myList, i => Console.WriteLine(i));
31 голосов
/ 01 июля 2009

Выше можно также написать с меньшим количеством кода как:

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

Это создает общий список и заполняет его IEnumerable, а затем вызывает объекты списка ForEach.

26 голосов
/ 26 ноября 2011

Это то, что вы просите?

int[] numbers = { 1, 2, 3 };
numbers.ToList().ForEach(n => Console.WriteLine(n));
11 голосов
/ 25 апреля 2013
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; });
2 голосов
/ 30 октября 2013

Хочу отметить, что не о чем беспокоиться, если кто-то предоставит ответ в качестве метода расширения, потому что метод расширения - это просто классный способ вызова метода экземпляра. Я понимаю, что вы хотите получить ответ без использования метода расширения. Независимо от того, определен ли метод как статический, экземпляр или расширение - результат один и тот же.

Приведенный ниже код использует код из принятого ответа для определения метода расширения и метода экземпляра и создает модульный тест, чтобы показать, что выходные данные одинаковы.

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);
    }
 }
0 голосов
/ 21 августа 2009

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

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”));
}
...