Alex Rivera | Logout

Replacement for for... if array iteration

Asked 2008-08-16T22:28:39.827
12

I love list comprehensions in Python, because they concisely represent a transformation of a list.

However, in other languages, I frequently find myself writing something along the lines of:

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

This example is in C#, where I'm under the impression LINQ can help with this, but is there some common programming construct which can replace this slightly less-than-elegant solution? Perhaps a data structure I'm not considering?

Edit
Report

2 Answers

7

The increment in the original foreach loop will not affect the contents of the array, the only way to do this remains a for loop:

for(int i = 0; i < intArray.Length; ++i)
{
    if(intArray[i] > 3) ++intArray[i];
}

Linq is not intended to modify existing collections or sequences. It creates new sequences based on existing ones. It is possible to achieve the above code using Linq, though it is slightly against its purposes:

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

Using where (or equivalent), as shown in some of the other answers, will exclude any values less than or equal to 3 from the resulting sequence.

var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }

There is a ForEach method on arrays that will allow you to use a lambda function instead of a foreach block, though for anything more than a method call I would stick with foreach.

intArray.ForEach(i => DoSomething(i));
answered 2008-08-17T00:44:57.650
2

In C# you can apply selective processing on anything that lives inside an IEnumerable like this:

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

Etc..

answered 2008-08-16T23:06:52.013

Your Answer