Во-первых, я знаю, что во фреймворке уже есть методы от общего класса List<>
для итерации по List<>
.
Но в качестве примера, каков правильный синтаксис для написания метода ForEach для итерации по каждому объекту класса List<>
и выполнения Console.WriteLine(object.ToString())
для каждого объекта.
Что-то, что принимает List<>
в качестве первого аргумента и лямбда-выражение в качестве второго аргумента.
Большинство примеров, которые я видел, сделаны как методы расширения или используют LINQ. Я ищу пример простого метода.
public void Each<T>(IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
action(item);
}
... и назвать его так:
Each(myList, i => Console.WriteLine(i));
Вышеприведенное можно было бы записать с меньшим количеством кода как:
new List<SomeType>(items).ForEach(
i => Console.WriteLine(i)
);
Это создает общий список и заполняет его IEnumerable, а затем вызывает объекты списка ForEach.
Это то, что вы'вновь просит?
int[] numbers = { 1, 2, 3 };
numbers.ToList().ForEach(n => Console.WriteLine(n));
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; });
Хочу поставить там, что там не так много, чтобы беспокоиться, если кто-то дает ответ, как метод расширения, так как метод расширения-это просто хороший способ, чтобы вызвать метод экземпляра. Я понимаю, что вы хотите получить ответ, не используя метод расширения. Независимо от того, если этот метод определен как статический экземпляр или расширения - результат тот же.
Приведенный ниже код использует код из принятого ответа, чтобы определить метод расширения и метод экземпляра и создает тестовый блок, чтобы показать выход такой же.
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);
}
}
В буквальном смысле, единственное, что вам нужно сделать, чтобы преобразовать методом расширения в метод экземпляра удалить статическая и модификатора первого параметра метода.
Этот метод
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);
}
}
Вы можете просматривать каждую строку в списке и даже искать во всем роде с помощью одного оператора, что облегчает поиск.
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”));
}