C#

.NET Array Collections File String Async Cast DataTable DateTime Dictionary Enum Exception For Foreach IEnumerable If IndexOf Lambda LINQ List Parse Path Process Property Regex Replace Sort Split StringBuilder Substring Switch Tuple

Loop

For-loops. Often we loop through numbers. These can be used as indexes of an array, or just for a numeric algorithm. For-loops are ideal here.


Range

With an iteration variable, for-loops begin at a certain value and end at another. They pass through a range of numbers. For is versatile and fast.


Lowercase i

A for-loop. Here, the name of the variable "i" is a convention. It is easier for other programmers to understand than unusual variable names.

Start:The loop starts at the value 0. In C# most collections are zero-based, so the first element is at 0.

End:The loop continues running through the body until "i" equals 10 (or some other value if it is set elsewhere).

Increment:Please note the third clause in the for-loop, the i++ part. This is the iteration statement—it occurs after each pass.

Based on:

.NET 4.5

C# program that uses increment loop

using System;

class Program
{
    static void Main()
    {
	for (int i = 0; i < 10; i++)
	{
	    Console.WriteLine(i);
	}
    }
}

Output

0
1
2
3
4
5
6
7
8
9
Summary

Decrement loop. This is a simple example. A for-loop can decrement in the step condition. Here we start at 10, and continue until 0 is reached.

C# program that uses decrement loop

using System;

class Program
{
    static void Main()
    {
	for (int i = 10 - 1; i >= 0; i--)
	{
	    Console.WriteLine(i);
	}
    }
}

Output

9
8
7
6
5
4
3
2
1
0
Iterate

Iteration step. The third clause in the for-loop is the step. This can change the variable (or any variable) by any amount—a constant is not even needed.

Two:Here we add two after each pass through the loop. So we skip odd number indexes.

C# program that uses step increment loop

using System;

class Program
{
    static void Main()
    {
	for (int i = 0; i < 10; i += 2)
	{
	    Console.WriteLine(i);
	}
    }
}

Output

0
2
4
6
8
Line

Decrement, step. This program revisits loop decrementing. It decreases the iteration variable by two each time. The example is simple and straightforward.

C# program that uses step decrement loop

using System;

class Program
{
    static void Main()
    {
	for (int i = 10 - 1; i >= 0; i -= 2)
	{
	    Console.WriteLine(i);
	}
    }
}

Output

9
7
5
3
1
Expression

Expression, maximum bound. Complex expressions, even method calls, can be used in the conditions of a for-loop. This can help simplify code.

However:Be careful not to call an expensive function too much. Unneeded operations can end up executing.

C# program that uses expression in maximum bounds

using System;

class Program
{
    static void Main()
    {
	for (int i = 0; i < (20 / 2); i += 2)
	{
	    Console.WriteLine(i);
	}
    }
}

Output

0
2
4
6
8
Loop

First part. When a for-loops is encountered, the first of the three statements is executed. The for-loop shown first has its "int i = 0" statement executed.

Tip:We can start a for-loops with any value for the iteration variable. The value does not need to be a constant.

Second part:Evaluated before the first iteration, and after each execution. If this is true, the loop proceeds. If false, it stops.

True, False

Third part:Specifies how the iteration variable (i) changes after each successful iteration.


Char-type

Chars. A for-loop often uses an int index. But other index types are possible. Here I use a char variable and loop over all the lowercase letters.

Tip:Often a for-loop over chars is useful for initializing a lookup table. Each char is accessed separately.

Char Lookup Table
C# program that uses for, char range

using System;

class Program
{
    static void Main()
    {
	// ... Loop over character range.
	for (char c = 'a'; c <= 'z'; c++)
	{
	    Console.WriteLine(c);
	}
    }
}

Output

a
b
c
d
e....
Books

Variable names. In isolated, small loops, a simple name such as the famous "i" is a good choice. It is standard. It is short. It is easy to type and remember.

But:If the variable is used to access an array, you can change the name to a more descriptive word to indicate its purpose.

Letter i:This identifier has no importance. It is simply a tradition. The book Code Complete by Steve McConnell has great detail here.


Squares: grey

A name mistake. Single-letter loop iteration variables seem convenient. But what happens when we have nested loops, and mistake "i" for "j?" Sometimes more descriptive names are better.


Concept

Compilers. Programs commonly spend most of their time in tight loops such as for-loops. Compilers put considerable effort into speeding up these constructs. This is worthwhile.

Note:Fields of mathematics such as linear algebra can be used to analyze data reuse and data dependence in for-loops.

Note 2:Compilers use techniques such as strength reduction to improve performance of affine expressions based on iteration variables.


String face

Strings. All kinds of loops work with strings. But the for-loop is often preferable for its syntax and index variable. Testing chars directly is fastest.

Loop, String CharsLoop, String
2D array

Arrays, 2d arrays. Loop constructs can be used upon arrays and 2D arrays. With 1D arrays, the code is straightforward. But with 2D arrays, we must divide our indexes to correctly loop.

Loop, ArrayLoop, String ArrayLoop, 2D Array
Performance

Performance. The for-loop is often the fastest way to loop over a series of numbers. It does not require allocations. It is easy for the compiler to optimize.

Array:The JIT compiler can detect array accesses in a for-loop. It can determine the iteration variable will never be out-of-bounds.

Then:It can automatically removes array bounds checking. Because of this, the simplest for-loops are sometimes fastest.


Performance optimization

Optimization. How can we make loops go faster? Shaving nanoseconds off a program's runtime should always be at the top of our priority list. We try code tuning loops.

1. Decrement:This applies only to loops with indexes, like for-loops or while-loops or more complex foreach-loops.

Decrement Loops

2. Jam:Jam is a popular food. But when we jam loops, we combine them to reduce iterations in them.

Jam Loops

3. Unwind:Do we really need a loop at all? Why not just unwind the loop statements?

Unwind Loops
Break-keyword

Break. This stops a loop. It can be used with any kind of loop—it may be more useful in "while" loops. No further iterations are processed.

Break
Continue

Continue. This stops the current iteration of a loop—it is like a "goto" to the end of the current loop block. The loop does not terminate.

Continue
Goto-keyword

Goto. This transfers control to an offset.
With goto we can go to enclosing,
but not enclosed,
blocks. Goto is often considered a poor choice in programs.

Goto
None

Empty. The empty statement counts as a loop body. It is a simple semicolon after nothing. This lets us create loops that have no statements.

Empty Statement
Squares: grey

Spaghetti code. Loops help improve code that is hard to follow due to its complex flow control (often called spaghetti code). Loops impart structure to code.

Loop, Two Variables
Summary: 300, 200 and 100

Summarizing for: this loop is powerful and easy to write. It is my loop of choice. It makes a C# program feel more like the old times when developers were writing C code.