再见大家, 我终于能够从 .NET Framework 2.0 切换到 .NET Framework 4.0。
我正在尝试获取有关 lambda 表达式和 LINQ 的一些经验。
是否可以翻译这个:
for (int cont = 0;cont < args.Length; cont++)
Console.WriteLine("#" + cont + " " + "<" + args + ">");
变成单行 lambda 表达式,或使用 LINQ,或什至是我不知道的其他构造? 提前谢谢你。
最佳答案
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().ForEach in Linq 并查看类似问题的解决方案)
现在,如果你讨厌自己,你可以这样做:
strs.Select((p, index) =>
{
Console.WriteLine("#" + index + " " + "<" + p + ">");
return true;
}).All(p => p);
我们正在使用 .All(p => p)
“实现”Select
手术。这是因为 Select
是“懒惰的”,如果没有人循环它就不会执行。
从技术上讲,您甚至可以尝试对其进行一些混淆:
strs.Select((p, index) =>
{
Console.WriteLine("#" + index + " " + "<" + p + ">");
return false;
}).Any(p => p);
( All
检查所有元素是否为 true
并在其中一个为 false
时停止,因此它必须循环所有元素(因为我们总是 return true;
)。Any
(如所写) 检查至少有一个元素是 true
然后停止(但我们所有的元素都是 false
,因为我们做 return false;
所以 Any
将循环所有元素)
现在……这些技术相对于使用 ToList
的优势是我们不是在“复制” Array
到 List<T>
只是为了使用 List<T>
的“错误”方法.如果ForEach
List<T>
的方法|是“错误的”,复制一个 Array
到 List
仅仅使用它是双重错误的。
关于c# - 非常简单的lambda表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7886041/