我想知道如何用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);
}
现在如何在一行中编写这个简单的循环?
由于
答案 0 :(得分:6)
The advice of Eric Lippert不是将这样的循环写成表达式。
如果代码没有副作用并产生值,则仅使用查询表达式。
在这种情况下,您循环重复一个语句,该语句在控制台上有副作用并且不返回值。所以foreach循环更清晰,专门为此目的而设计。
另一方面,一个动作(可能有副作用)可以在执行之前被视为纯值 。所以这是一个数字列表:
List<int> numbers = Enumerable.Range(1, 10).ToList();
由此我们列出了一系列行动:
List<Action> actions = numbers.Select(n => Console.WriteLine(n)).ToList();
虽然我们正在处理具有副作用的操作,但我们实际上根本没有运行它们,因此对该列表内容的任何进一步操作都不会产生副作用。最后,当我们有我们需要的列表时,我们可以使用forloop来执行它:
foreach (var a in actions)
a();
这是一个如此简单的模式,可以说RunAll
上的IEnumerable<Action>
扩展方法不是坏事。实际上,.NET框架内置了这个概念:多播委托是一个可以调用的东西,它在列表中执行一堆委托。在最常见的用例(事件)中,这些代表有副作用。
答案 1 :(得分:5)
您可以使用ForEach方法:
strlist.ForEach(x => Console.WriteLine(x));
正如评论中所指出,这仅适用于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);
}
}
}
答案 2 :(得分:3)
您可以使用ForEach
方法(List<T>
或您自己IEnumerable<T>
) - 但它不是“惯用于LINQ-y”。
LINQ基于功能原则 - 因此您提供的功能通常应该是无副作用的。如果函数 没有副作用,ForEach
是没有意义的,所以这两种方法都处于紧张状态。
Eric Lippert有blog post提供更多详情。
当你想要做某些数据时,使用foreach
基本上没有错; LINQ用于查询数据。通常,您构建一个LINQ查询,然后使用foreach
语句使用数据。