2008-08-16 62 views
6

我喜欢Python中的列表推导,因为它们简洁地表示了列表的转换。替换for ... if数组迭代

然而,在其他语言中,我经常发现自己写的线沿线的东西:

foreach (int x in intArray) 
    if (x > 3) //generic condition on x 
    x++ 
    //do other processing 

这个例子是在C#中,在我的印象LINQ下,可以在这方面帮助,但有一些常见的编程结构可以取代这种稍微不太优雅的解决方案?也许我不考虑一个数据结构?

回答

5

在增量原来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)); 
-1

取决于语言和你需要做什么,一个“地图”,因为它被称为许多语言可能是你在找什么。我不知道C#,但根据this页面,.NET 2.0调用映射“ConvertAll”。

“map”的含义非常简单 - 获取一个列表,并为其中的每个元素应用一个函数,返回一个新列表。你也可能正在寻找“过滤器”,它会给你一个满足另一个列表中谓词的项目列表。

0
在Ruby中

intArray.select { |x| x > 3 }.each do |x| 
    # do other processing 
end 

,或者“其他处理”是一个短的一行:

intArray.select { |x| x > 3 }.each { |x| something_that_uses x } 

最后,如果你想返回包含处理结果的新数组那些大于3的元素:

intArray.select { |x| x > 3 }.map { |x| do_something_to x } 
1

在Python中,您有filter and map,w HICH可以使你想要什么:

map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray)) 

还有list comprehensions可以在一个简单的声明一举两得:

[f(x + 1) for x in intArray if x > 3] 
2

在C#中,你可以在任何一个IEnumerable内住这样的应用选择性处理:

intArray.Where(i => i > 3).ConvertAll(); 
DoStuff(intArray.Where(i => i 3)); 

等。

0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))