14,210,255 members
Tip/Trick
Posted 18 Apr 2012

43.1K views
18 bookmarked

Who knows Enumerable.Range(...)?

,
Rate this:
14 Apr 2013     CPOL
Make loops behave deterministic-by-construction

Introduction

I quite often see constructs like:

```for(int n = 0; n < len; ++n)
{
//... some more or less complex conditional control flow...
n = 5; // causes the loop to never terminate if len is greater than 5
//... some more code ...
}```

This is a legal language construct, but it introduces the danger of non-determinism.

This tip aims to show some deterministic alternatives to that plain `for` loop.

Using the Code

If you need to loop over some range of integer, consider using the Enumerable.Range[^] based `foreach` loop instead:

```using System.Linq;
...
foreach (int n in Enumerable.Range(0, len))
{
...
}```

This guarantees that it iterates over all elements in strict sequence. Another benefit is that you cannot assign any other value to the loop variable `n`. E.g.

```foreach (int n in Enumerable.Range(0, len))
{
n = 5; // Compiler error!
}```

Note: `Enumerable.Range(...)` is not from, to, but from, count:

```//
// Summary:
//     Generates a sequence of integral numbers within a specified range.
//
// Parameters:
//   start:
//     The value of the first integer in the sequence.
//
//   count:
//     The number of sequential integers to generate.
//
// Returns:
//     An IEnumerable<Int32> in C# or IEnumerable(Of Int32) in Visual Basic that
//     contains a range of sequential integral numbers.
//
// Exceptions:
//   System.ArgumentOutOfRangeException:
//     count is less than 0.-or-start + count -1 is larger than System.Int32.MaxValue.
public static IEnumerable<int> Range(int start, int count);```

Alternatives

One could also build his own iterator functions (see also C# Iterator Pattern demystified[^]). E.g.

```public static IEnumerable<int> CountUp(int n, int count)
{
while (count-- > 0) yield return n++;
}
public static IEnumerable<int> CountDown(int n, int count)
{
while (count-- > 0) yield return n--;
}```

When used like this...

```foreach (int n in CountUp(0, 5)) Console.WriteLine(n);
foreach (int n in CountDown(100, 5)) Console.WriteLine(n);```

...results in:

```0
1
2
3
4
100
99
98
97
96```

You can define any complexity of traversing sequence in that function and let the `foreach`-loop terminate deterministically, based on that sequence.

Try to avoid plain `for (...)` loops and replace by some deterministic loop alternative like:

• `foreach( ... Range(...))`
• `foreach( ... CountUp(...))`
• etc.

Other alternatives are Linq iterations like Enumerable.Aggregate[^] etc. But these are a bit more advanced.

History

• 2012-04-18 First version
• 2012-04-19 Added hand-crafted `CountUp`/`CountDown `functions
• 2013-04-14 Fixed some broken HTML markup in C# code generics

Share

 Founder eXternSoft GmbH Switzerland
I feel comfortable on a variety of systems (UNIX, Windows, cross-compiled embedded systems, etc.) in a variety of languages, environments, and tools.
I have a particular affinity to computer language analysis, testing, as well as quality management.

More information about what I do for a living can be found at my LinkedIn Profile and on my company's web page (German only).

 First Prev Next
 My vote of 5 Adam Mendoza22-Apr-13 23:06 Adam Mendoza 22-Apr-13 23:06
 Re: My vote of 5 Andreas Gieriet23-Apr-13 12:59 Andreas Gieriet 23-Apr-13 12:59
 overcoming "from, count" Matt T Heffron15-Apr-13 7:38 Matt T Heffron 15-Apr-13 7:38
 Re: overcoming "from, count" Andreas Gieriet15-Apr-13 10:33 Andreas Gieriet 15-Apr-13 10:33
 Re: overcoming "from, count" Matt T Heffron15-Apr-13 10:43 Matt T Heffron 15-Apr-13 10:43
 Re: overcoming "from, count" Andreas Gieriet15-Apr-13 12:02 Andreas Gieriet 15-Apr-13 12:02
 Re: overcoming "from, count" Matt T Heffron15-Apr-13 12:09 Matt T Heffron 15-Apr-13 12:09
 Another readability optimization paul.vencill15-Apr-13 1:09 paul.vencill 15-Apr-13 1:09
 Re: Another readability optimization Andreas Gieriet15-Apr-13 5:50 Andreas Gieriet 15-Apr-13 5:50
 Thoughts PIEBALDconsult14-Apr-13 15:30 PIEBALDconsult 14-Apr-13 15:30
 My vote of 5 Kenneth Haugland3-Sep-12 13:53 Kenneth Haugland 3-Sep-12 13:53
 Re: My vote of 5 Andreas Gieriet3-Sep-12 20:21 Andreas Gieriet 3-Sep-12 20:21
 Thanks for your 5! Have fun with iterators! Cheers Andi
 Pros and Cons and ... Jani Giannoudis18-Apr-12 12:26 Jani Giannoudis 18-Apr-12 12:26
 Re: Pros and Cons and ... Andreas Gieriet18-Apr-12 21:22 Andreas Gieriet 18-Apr-12 21:22
 Your problem is not the for... Paulo Zemek18-Apr-12 9:48 Paulo Zemek 18-Apr-12 9:48
 Re: Your problem is not the for... Andreas Gieriet18-Apr-12 10:56 Andreas Gieriet 18-Apr-12 10:56
 Re: Your problem is not the for... Paulo Zemek18-Apr-12 14:10 Paulo Zemek 18-Apr-12 14:10
 Re: Your problem is not the for... Andreas Gieriet18-Apr-12 18:05 Andreas Gieriet 18-Apr-12 18:05
 Re: Your problem is not the for... TimothyP22-Apr-13 8:26 TimothyP 22-Apr-13 8:26
 Re: Your problem is not the for... Andreas Gieriet22-Apr-13 8:45 Andreas Gieriet 22-Apr-13 8:45
 Last Visit: 18-Jun-19 10:47     Last Update: 18-Jun-19 10:47 Refresh 1

General    News    Suggestion    Question    Bug    Answer    Joke    Praise    Rant    Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.