用linq替换一个简单的for循环

时间:2009-12-05 08:30:52

标签: 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);
}

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

由于

3 个答案:

答案 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语句使用数据。