用linq替换一个简单的forloop

Jos*_*osh 0 linq foreach

我想知道如何用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)

现在我如何在一行中编写这个简单的循环?

谢谢

Dan*_*ker 6

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框架内置了这个概念:多播委托是一个可以调用的东西,它在列表中执行一堆委托.在最常见的用例(事件)中,这些代表有副作用.


Dar*_*rov 5

您可以使用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)