2008-12-04 2 views
31

Во-первых, я знаю, что есть методы от общего класса List<>, уже находящегося в каркасе, итерации по List<>.C# Синтаксис - Пример выражения Lambda - ForEach() над общим списком

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

Большинство примеров, которые я видел, выполняются как методы расширения или связаны с 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 <> делегаты - это общие делегаты для методов WITHOUT возвращаемых значений. Это единственное различие. – 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); 
    } 
}