我喜欢Python中的列表推导,因为它们简洁地表示了列表的转换.
但是,在其他语言中,我经常发现自己写的内容如下:
foreach (int x in intArray) if (x > 3) //generic condition on x x++ //do other processing
这个例子在C#中,我的印象是LINQ可以帮助解决这个问题,但是有一些常见的编程结构可以取代这个稍微不那么优雅的解决方案吗?也许我不考虑数据结构?
原始foreach
循环中的增量不会影响数组的内容,唯一的方法仍然是for
循环:
for(int i = 0; i < intArray.Length; ++i) { if(intArray[i] > 3) ++intArray[i]; }
Linq不打算修改现有的集合或序列.它基于现有序列创建新序列.使用Linq可以实现上述代码,尽管它略微违背了它的目的:
var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i)); var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));
使用where
(或等同物),如图一些其他的答案,将排除任何值小于或从得到的序列等于3.
var intArray = new int[] { 10, 1, 20, 2 }; var newArray = from i in intArray where i > 3 select i + 1; // newArray == { 11, 21 }
有一个ForEach
阵列上,将允许您使用lambda函数,而不是一个方法foreach
块,但任何东西比一个方法调用我要坚持多foreach
.
intArray.ForEach(i => DoSomething(i));