我想知道如何用linq替换一个简单的foreach循环.我不是在寻找关于2个或更多循环的答案....它专门用于单个foreach循环..
List<string> strlist=new List<string>();
strlist.Add("Hello");
strlist.Add("World");
//The main "to be linq" here...
foreach(string str in strlist)
{
Console.Writeline(str);
}
Run Code Online (Sandbox Code Playgroud)
现在我如何在一行中编写这个简单的循环?
谢谢
Eric Lippert的建议不是将这样的循环写成表达式.
如果代码没有副作用并产生值,则仅使用查询表达式.
在这种情况下,您循环重复一个语句,该语句在控制台上有副作用并且不返回值.所以foreach循环更清晰,专门为此目的而设计.
另一方面,可以在执行之前将动作(可能具有副作用)视为纯值.所以这是一个数字列表:
List<int> numbers = Enumerable.Range(1, 10).ToList();
Run Code Online (Sandbox Code Playgroud)
从那里我们列出了一系列动作:
List<Action> actions = numbers.Select(n => Console.WriteLine(n)).ToList();
Run Code Online (Sandbox Code Playgroud)
虽然我们正在处理具有副作用的操作,但我们实际上根本没有运行它们,因此对该列表内容的任何进一步操作都不会产生副作用.最后,当我们有我们需要的列表时,我们可以使用forloop来执行它:
foreach (var a in actions)
a();
Run Code Online (Sandbox Code Playgroud)
这是一个如此简单的模式,可以认为RunAll扩展方法IEnumerable<Action>并不是坏事.实际上,.NET框架内置了这个概念:多播委托是一个可以调用的东西,它在列表中执行一堆委托.在最常见的用例(事件)中,这些代表有副作用.
您可以使用ForEach方法:
strlist.ForEach(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)
正如评论中指出的那样,这只适用于List<T>.如果您的数据源是一个,IEnumerable<T>您可以编写一个扩展方法:
public static class EnumerableExtensions
{
public static void ForEach<T>(this IEnumerable<T> inputList, Action<T> action)
{
foreach (var item in inputList)
{
action(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)