24

What is the major difference between for and foreach loops?

In which scenarios can we use for and not foreach and vice versa.

Would it be possible to show with a simple program?

Both seem the same to me. I can't differentiate them.

Esteban Verbel
  • 738
  • 2
  • 20
  • 39
CHANDRA
  • 4,778
  • 8
  • 32
  • 51
  • 3
    [Short answer:](http://stackoverflow.com/a/1211611/380331) if iteration order is important - you should use `for` (for example if you want to iterate over collection _backwards_ or just every second element of it), if iteration order is not important - use `foreach`. (Btw it is possible to use `foreach` also in cases where iteration order is important - in that case you need to re-construct collection. But this degrades program perfomance) – Agnius Vasiliauskas Jun 07 '12 at 10:18

19 Answers19

26

a for loop is a construct that says "perform this operation n. times".

a foreach loop is a construct that says "perform this operation against each value/object in this IEnumerable"

Dave Bish
  • 19,263
  • 7
  • 46
  • 63
  • 24
    `for` isn't really "n. times", but rather "while this condition is met", which is *often* a simple counter check. And you don't actually need `IEnumerable` for `foreach`, but indeed: it is semantically a "fetch each item in turn" API. – Marc Gravell Jun 07 '12 at 10:15
  • 1
    Of course you're right - but in most cases, the more accurate definition you give, is how most people tend to think of a do/while loop. – Dave Bish Jun 07 '12 at 16:01
  • 1
    Add that the for loop dictates a specific sequential order, expressed in the loop index variable. Foreach is less bound to sequence because there is no index variable. Makes a big difference for parallelism. – dthorpe Jun 08 '12 at 19:16
13

You can use foreach if the object you want to iterate over implements the IEnumerable interface. You need to use for if you can access the object only by index.

Femaref
  • 60,705
  • 7
  • 138
  • 176
  • 6
    *technically* the `IEnumerable` interface is not a pre-requisite for `foreach`, but pretty much that ;p – Marc Gravell Jun 07 '12 at 10:13
  • 1
    In general, any interface offering a `Current` property and a `MoveNext` method would be enough, right? Should be the same technical circumstances as with the reimplementation of LINQ or Task by Jon Skeet? – Femaref Jun 07 '12 at 11:36
11

I'll tryto answer this in a more general approach:

foreach is used to iterate over each element of a given set or list (anything implementing IEnumerable) in a predefined manner. You can't influence the exact order (other than skipping entries or canceling the whole loop), as that's determined by the container.

foreach (String line in document) { // iterate through all elements of "document" as String objects
    Console.Write(line); // print the line
}

for is just another way to write a loop that has code executed before entering the loop and once after every iteration. It's usually used to loop through code a given number of times. Contrary to foreach here you're able to influence the current position.

for (int i = 0, j = 0; i < 100 && j < 10; ++i) { // set i and j to 0, then loop as long as i is less than 100 or j is less than 10 and increase i after each iteration
    if (i % 8 == 0) { // skip all numbers that can be divided by 8 and count them in j
        ++j
        continue;
    }
    Console.Write(i);
}
Console.Write(j);

If possible and applicable, always use foreach rather than for (assuming there's some array index). Depending on internal data organisation, foreach can be a lot faster than using for with an index (esp. when using linked lists).

Mario
  • 35,726
  • 5
  • 62
  • 78
  • In your `foreach` code block above, is there a reason you are using a `String` class instead of a `string` data type? Just out of curiosity, but I prefer usually the `string` data type. Also maybe add context to `for` loop, it is specifically separate in contrary to `foreach` loop by that it only runs if the conditional operation is met, `foreach` loop does not, it loops through the entire collection. – aidangig Nov 22 '22 at 18:24
5

Everybody gave you the right answer with regard to foreach, i.e. it's a way to loop through the elements of something implementing IEnumerable.

On the other side, for is much more flexible than what is shown in the other answers. In fact, for is used to executes a block of statements for as long as a specified condition is true.

From Microsoft documentation:

for (initialization; test; increment)
     statement

initialization Required. An expression. This expression is executed only once, before the loop is executed.

test Required. A Boolean expression. If test is true, statement is executed. If test if false, the loop is terminated.

increment Required. An expression. The increment expression is executed at the end of every pass through the loop.

statement Optional. Statement to be executed if test is true. Can be a compound statement.

This means that you can use it in many different ways. Classic school examples are the sum of the numbers from 1 to 10:

int sum = 0;
for (int i = 0; i <= 10; i++)
    sum = sum + i;

But you can use it to sum the numbers in an Array, too:

int[] anArr = new int[] { 1, 1, 2, 3, 5, 8, 13, 21 };
int sum = 0;
for (int i = 0; i < anArr.Length; i++)
    sum = sum + anArr[i];

(this could have been done with a foreach, too):

int[] anArr = new int[] { 1, 1, 2, 3, 5, 8, 13, 21 };
int sum = 0;
foreach (int anInt in anArr)
    sum = sum + anInt;

But you can use it for the sum of the even numbers from 1 to 10:

int sum = 0;
for (int i = 0; i <= 10; i = i + 2)
    sum = sum + i;

And you can even invent some crazy thing like this one:

int i = 65;
for (string s = string.Empty; s != "ABC"; s = s + Convert.ToChar(i++).ToString()) ;
    Console.WriteLine(s);
Francesco Baruchelli
  • 7,320
  • 2
  • 32
  • 40
4

for loop:

 1) need to specify the loop bounds( minimum or maximum).

  2) executes a statement or a block of statements repeatedly 
    until a specified expression evaluates to false.

Ex1:-

int K = 0;

for (int x = 1; x <= 9; x++){
        k = k + x ;
}

foreach statement:

1)do not need to specify the loop bounds minimum or maximum.

2)repeats a group of embedded statements for 
     a)each element in an array 
  or b) an object collection.       

Ex2:-

int k = 0;

int[] tempArr = new int[] { 0, 2, 3, 8, 17 };

foreach (int i in tempArr){
    k = k + i ;
}
kallol
  • 41
  • 1
4

foreach is almost equivalent to :

var enumerator = list.GetEnumerator();
var element;
while(enumerator.MoveNext()){
  element = enumerator.Current;
}

and in order to implemetn a "foreach" compliant pattern, this need to provide a class that have a method GetEnumerator() which returns an object that have a MoveNext() method, a Reset() method and a Current property.

Indeed, you do not need to implement neither IEnumerable nor IEnumerator.

Some derived points:

  • foreach does not need to know the collection length so allows to iterate through a "stream" or a kind of "elements producer".
  • foreach calls virtual methods on the iterator (the most of the time) so can perform less well than for.
polkduran
  • 2,533
  • 24
  • 34
4

It depends on what you are doing, and what you need.

If you are iterating through a collection of items, and do not care about the index values then foreach is more convenient, easier to write and safer: you can't get the number of items wrong.

If you need to process every second item in a collection for example, or process them ion the reverse order, then a for loop is the only practical way.

The biggest differences are that a foreach loop processes an instance of each element in a collection in turn, while a for loop can work with any data and is not restricted to collection elements alone. This means that a for loop can modify a collection - which is illegal and will cause an error in a foreach loop.

For more detail, see MSDN : foreach and for

Matt Caton
  • 3,473
  • 23
  • 25
NoName
  • 877
  • 12
  • 28
3

Difference Between For and For Each Loop in C#

  1. For Loops executes a block of code until an expression returns false while ForEach loop executed a block of code through the items in object collections.

  2. For loop can execute with object collections or without any object collections while ForEach loop can execute with object collections only.

  3. The for loop is a normal loop construct which can be used for multiple purposes where as foreach is designed to work only on Collections or IEnumerables object.

Pashupati Khanal
  • 733
  • 3
  • 11
  • 1
    Additionally, in 'for' loop we can update the collection whereas in 'foreach' loop we cannot change the collection once the loop is executed. – Surendra Shrestha Dec 20 '19 at 05:14
2

foreach is useful if you have a array or other IEnumerable Collection of data. but for can be used for access elements of an array that can be accessed by their index.

2

A for loop is useful when you have an indication or determination, in advance, of how many times you want a loop to run. As an example, if you need to perform a process for each day of the week, you know you want 7 loops.

A foreach loop is when you want to repeat a process for all pieces of a collection or array, but it is not important specifically how many times the loop runs. As an example, you are formatting a list of favorite books for users. Every user may have a different number of books, or none, and we don't really care how many it is, we just want the loop to act on all of them.

colonelclick
  • 2,165
  • 2
  • 24
  • 33
2

The for loop executes a statement or a block of statements repeatedly until a specified expression evaluates to false.

There is a need to specify the loop bounds (minimum or maximum). Following is a code example of a simple for loop that starts 0 till <= 5.

we look at foreach in detail. What looks like a simple loop on the outside is actually a complex data structure called an enumerator:

An enumerator is a data structure with a Current property, a MoveNext method, and a Reset method. The Current property holds the value of the current element, and every call to MoveNext advances the enumerator to the next item in the sequence.

Enumerators are great because they can handle any iterative data structure. In fact, they are so powerful that all of LINQ is built on top of enumerators.

But the disadvantage of enumerators is that they require calls to Current and MoveNext for every element in the sequence. All those method calls add up, especially in mission-critical code.

Conversely, the for-loop only has to call get_Item for every element in the list. That’s one method call less than the foreach-loop, and the difference really shows.

So when should you use a foreach-loop, and when should you use a for-loop?

Here’s what you need to do:

When you’re using LINQ, use foreach
When you’re working with very large computed sequences of values, use foreach
When performance isn’t an issue, use foreach
But if you want top performance, use a for-loop instead

Jayakumar Thangavel
  • 1,884
  • 1
  • 22
  • 29
1

The major difference between the for and foreach loop in c# we understand by its working:

The for loop:

  1. The for loop's variable always be integer only.
  2. The For Loop executes the statement or block of statements repeatedly until specified expression evaluates to false.
  3. In for loop we have to specify the loop's boundary ( maximum or minimum).-------->We can say this is the limitation of the for loop.

The foreach loop:

  1. In the case of the foreach loop the variable of the loop while be same as the type of values under the array.

  2. The Foreach statement repeats a group of embedded statements for each element in an array or an object collection.

  3. In foreach loop, You do not need to specify the loop bounds minimum or maximum.---> here we can say that this is the advantage of the for each loop.

Guillaume Jacquenot
  • 11,217
  • 6
  • 43
  • 49
1

I prefer the FOR loop in terms of performance. FOREACH is a little slow when you go with more number of items.

If you perform more business logic with the instance then FOREACH performs faster.

Demonstration: I created a list of 10000000 instances and looping with FOR and FOREACH.

Time took to loop:

  • FOREACH -> 53.852ms
  • FOR -> 28.9232ms

Below is the sample code.

class Program
{

    static void Main(string[] args)
    {
        List<TestClass> lst = new List<TestClass>();
        for (int i = 1; i <= 10000000; i++)
        {
            TestClass obj = new TestClass() {
                ID = i,
                Name = "Name" + i.ToString()
            };
            lst.Add(obj);
        }

        DateTime start = DateTime.Now;
        foreach (var obj in lst)
        {
            //obj.ID = obj.ID + 1;
            //obj.Name = obj.Name + "1";
        }
        DateTime end = DateTime.Now;
        var first = end.Subtract(start).TotalMilliseconds;

        start = DateTime.Now;
        for (int j = 0; j<lst.Count;j++)
        {
            //lst[j].ID = lst[j].ID + 1;
            //lst[j].Name = lst[j].Name + "1";
        }
        end = DateTime.Now;
        var second = end.Subtract(start).TotalMilliseconds;
    }
}

public class TestClass
{
    public long ID { get; set; }
    public string Name { get; set; }
}

If I uncomment the code inside the loop: Then, time took to loop:

  • FOREACH -> 2564.1405ms
  • FOR -> 2753.0017ms

Conclusion
If you do more business logic with the instance, then FOREACH is recommended. If you are not doing much logic with the instance, then FOR is recommended.

Saeed Zhiany
  • 2,051
  • 9
  • 30
  • 41
1

Many answers are already there, I just need to identify one difference which is not there.

for loop is fail-safe while foreach loop is fail-fast.

Fail-fast iteration throws ConcurrentModificationException if iteration and modification are done at the same time in object.

However, fail-safe iteration keeps the operation safe from failing even if the iteration goes in infinite loop.

public class ConcurrentModification {
    public static void main(String[] args) {
        List<String> str = new ArrayList<>();

        for(int i=0; i<1000; i++){
            str.add(String.valueOf(i));
        }

        /**
         * this for loop is fail-safe. It goes into infinite loop but does not fail. 
         */
        for(int i=0; i<str.size(); i++){
            System.out.println(str.get(i));
            str.add(i+ "  " + "10");
        }

        /**
         * throws ConcurrentModificationexception 
        for(String st: str){
            System.out.println(st);
            str.add("10");
        }
        */

        /* throws ConcurrentModificationException 
         Iterator<String> itr = str.iterator();
        while(itr.hasNext()) {
            System.out.println(itr.next());
            str.add("10");
        }*/
    }
} 

Hope this helps to understand the difference between for and foreach loop through different angle.

I found a good blog to go through the differences between fail-safe and fail-fast, if anyone interested:

S Kumar
  • 555
  • 7
  • 21
0

simple difference between for and foreach

for loop is working with values. it must have condition then increment and intialization also. you have to knowledge about 'how many times loop repeated'.

foreach is working with objects and enumaretors. no need to knowledge how many times loop repeated.

ks1322
  • 33,961
  • 14
  • 109
  • 164
0

You can use the foreach for an simple array like

int[] test = { 0, 1, 2, 3, ...};

And you can use the for when you have a 2D array

int[][] test = {{1,2,3,4},
                {5,2,6,5,8}};
noonana
  • 13
  • 3
0

foreach syntax is quick and easy. for syntax is a little more complex, but is also more flexible.

foreach is useful when iterating all of the items in a collection. for is useful when iterating overall or a subset of items.

The foreach iteration variable which provides each collection item, is READ-ONLY, so we can't modify the items as they are iterated. Using the for syntax, we can modify the items as needed.

Bottom line- use foreach to quickly iterate all of the items in a collection. Use for to iterate a subset of the items of the collection or to modify the items as they are iterated.

-1

The foreach statement repeats a group of embedded statements for each element in an array or an object collection that implements the System.Collections.IEnumerable or System.Collections.Generic.IEnumerable interface. The foreach statement is used to iterate through the collection to get the information that you want, but can not be used to add or remove items from the source collection to avoid unpredictable side effects. If you need to add or remove items from the source collection, use a for loop.

sireesh
  • 11
-2

One important thing related with foreach is that , foreach iteration variable cannot be updated(or assign new value) in loop body.

for example :

List<string> myStrlist = new List<string>() { "Sachin", "Ganguly", "Dravid" };
              foreach(string item in myStrlist)

              {

                  item += " cricket"; // ***Not Possible*** 

              }

  • 3
    Actually you are wrong. Result of your code will be `{ "Sachin cricket", "Ganguly cricket", "Dravid cricket" }` What you can not do is add/remove items in the list. calling `myStrlist.Add("Another");` wtihin a loop will cause an exception. – 0wl May 11 '20 at 15:44