很容易lambda表达

Dun*_*oud 1 .net c# linq lambda

Ciao大家,我终于能够从.NET Framework 2.0切换到.NET Framework 4.0.

我正在尝试获得有关lambda表达式和LINQ的一些经验.

有可能翻译这个:

for (int cont = 0;cont < args.Length; cont++)
    Console.WriteLine("#" + cont + " " + "<" + args + ">");
Run Code Online (Sandbox Code Playgroud)

单行lambda表达式,或者使用LINQ,甚至是其他一些我不知道的costruct?先感谢您.

xan*_*tos 6

LINQ操作不应该有副作用或执行操作.它们只应用于从IEnumerable<T>另一个IEnumerable<T>(或从IQueryable<T>另一个IQueryable<T>或另一个IEnumerable<T>)生成(或者如果聚合.Max,则.All......单个结果)

请阅读http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx.

(并注意这个问题在SO上问得很详细...例如我在这里回答ToList().在Linq中的ForEach并看到类似问题的解决方案)

现在,如果你讨厌自己,你可以这样做:

strs.Select((p, index) =>
{
    Console.WriteLine("#" + index + " " + "<" + p + ">");
    return true;
}).All(p => p);
Run Code Online (Sandbox Code Playgroud)

我们正在使用.All(p => p)"实现" Select操作.这是因为Select"懒惰",如果没有人循环它将不会被执行.

从技术上讲,你甚至可以尝试对它进行一些模糊处理:

strs.Select((p, index) =>
{
    Console.WriteLine("#" + index + " " + "<" + p + ">");
    return false;
}).Any(p => p);
Run Code Online (Sandbox Code Playgroud)

(All检查所有元素是否都true停止,如果其中一个是false,那么它必须循环所有元素(因为我们总是return true;).Any(如所写)检查至少有一个元素true然后停止(但是我们所有的元素)元素是false,因为我们这样return false;Any将循环所有元素)

现在......这些技术优于使用的优点ToList是我们不会"复制" ArrayList<T>只是使用"错误"的方法List<T>.如果ForEach方法List<T>是"错误的",复制Array到一个List只是使用它是双重错误.