首先,我知道框架中已有的通用List<>
类的方法会迭代List<>
。
但是作为一个例子,编写ForEach方法迭代List<>
的每个对象,并对每个对象执行Console.WriteLine(object.ToString())
的正确语法是什么。
将List<>
作为第一个参数,将lambda表达式作为第二个参数的东西。
我见过的大多数示例都是作为扩展方法完成的,或涉及LINQ。我正在寻找一个简单的方法示例。
答案 0 :(得分:55)
public void Each<T>(IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
action(item);
}
......并且这样称呼它:
Each(myList, i => Console.WriteLine(i));
答案 1 :(得分:30)
以上也可以使用较少的代码编写:
new List<SomeType>(items).ForEach(
i => Console.WriteLine(i)
);
这将创建一个通用列表并使用IEnumerable填充它,然后调用列表对象ForEach。
答案 2 :(得分:26)
这是你要求的吗?
int[] numbers = { 1, 2, 3 };
numbers.ToList().ForEach(n => Console.WriteLine(n));
答案 3 :(得分:11)
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; });
答案 4 :(得分:2)
想知道如果有人提供答案作为扩展方法,那就不用担心,因为扩展方法只是一种调用实例方法的好方法。我知道你想要答案而不使用扩展方法。无论方法是定义为静态,实例还是扩展 - 结果都是相同的。
下面的代码使用接受答案中的代码来定义扩展方法和实例方法,并创建一个单元测试来显示输出是否相同。
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);
}
}
答案 5 :(得分: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”));
}