for和foreach有什么区别?

时间:2012-06-07 09:59:11

标签: c# for-loop foreach

forforeach循环之间的主要区别是什么?

我们可以在哪些情况下使用for而不是foreach,反之亦然。

是否可以通过简单的程序进行展示?

两者对我来说都是一样的。我无法区分它们。

19 个答案:

答案 0 :(得分:19)

for循环是一个构造,表示“执行此操作 n。次”。

foreach循环是一个构造,表示“对此IEnumerable中的每个值/对象执行此操作”

答案 1 :(得分:11)

如果要迭代的对象实现foreach接口,则可以使用IEnumerable。如果只能通过索引访问对象,则需要使用for

答案 2 :(得分:11)

我会尝试用更通用的方法回答这个问题:

foreach用于以预定义的方式迭代给定集合或列表的每个元素(实现IEnumerable的任何内容)。您不能影响确切的顺序(跳过条目或取消整个循环除外),因为这是由容器决定的。

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

for只是另一种编写循环的方法,该循环在进入循环之前执行代码,在每次迭代之后执行一次。它通常用于循环遍历代码给定次数。与foreach相反,您可以影响当前位置。

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);

如果可能且适用,请始终使用foreach而不是for(假设有一些数组索引)。根据内部数据组织,foreach可能比使用带有索引的for快得多(特别是在使用链接列表时)。

答案 3 :(得分:5)

每个人都给出了关于foreach的正确答案,即它是一种循环实现IEnumerable的元素的方法。

另一方面,因为它比其他答案中显示的更灵活。实际上,只要指定的条件为真,就用于执行语句块。

来自Microsoft文档:

for (initialization; test; increment)
     statement

初​​始化 需要。一种表达。在执行循环之前,此表达式仅执行一次。

测试 需要。布尔表达式。如果test为true,则执行语句。如果测试为false,则循环终止。

增量 需要。一种表达。递增表达式在每次循环结束时执行。

语句 可选的。如果测试为真,则执行语句。可以是复合语句。

这意味着您可以通过多种不同方式使用它。经典学校的例子是从1到10的数字的总和:

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

但你也可以用它来对数组中的数字求和:

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];

(这也可以用foreach完成):

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

但你可以用它来表示从1到10的偶数之和:

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

你甚至可以发明一些像这样的疯狂的东西:

int i = 65;
for (string s = string.Empty; s != "ABC"; s = s + Convert.ToChar(i++).ToString()) ;
    Console.WriteLine(s);

答案 4 :(得分:3)

for循环:

 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.

练习1: -

int K = 0;

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

foreach声明:

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.       

练习2: -

int k = 0;

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

foreach (int i in tempArr){
    k = k + i ;
}

答案 5 :(得分:2)

如果你有一个数组或其他IEnumerable数据集,那么

foreach非常有用。但是可以用于可以通过索引访问的数组的访问元素。

答案 6 :(得分:2)

如果您预先指示或确定要循环运行的次数,则for循环非常有用。例如,如果您需要为一周中的每一天执行一个过程,您就知道需要7个循环。

foreach循环是指您希望为集合或数组的所有部分重复进程,但具体并不重要的是循环运行的次数。例如,您正在为用户格式化喜爱的书籍列表。每个用户可能拥有不同数量的书籍,或者没有书籍,我们并不关心它有多少,我们只想让循环对所有书籍采取行动。

答案 7 :(得分:2)

foreach 几乎等同于:

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

为了实现“foreach”兼容模式,需要提供一个具有 GetEnumerator()方法的类,该方法返回一个具有 MoveNext()的对象方法,重置()方法和当前属性。

实际上,您既不需要实现IEnumerable也不需要实现IEnumerator。

答案 8 :(得分:2)

这取决于你在做什么,以及你需要什么。

如果您正在迭代一组项目,并且不关心索引值,则foreach更方便,更容易编写且更安全:您无法获得错误的项目数。

如果你需要处理集合中的每一个项目,或者按相反顺序处理它们,那么for循环是唯一可行的方法。

最大的区别在于foreach循环依次处理集合中每个元素的实例,而for循环可以处理任何数据,并且不仅限于集合元素。这意味着for循环可以修改一个集合 - 在foreach循环中非法并且会导致错误

有关详细信息,请参阅MSDN:foreachfor

答案 9 :(得分:1)

c#中for和foreach循环之间的主要区别在于它的工作原理:

for循环:

  1. for循环的变量始终只是整数。
  2. For循环重复执行语句或语句块,直到指定的表达式计算为false。
  3. 在for循环中,我们必须指定循环的边界(最大或最小).--------&gt;我们可以说这是for循环的限制。
  4. foreach循环:

    1. 在foreach循环的情况下,循环的变量与数组下的值类型相同。

    2. Foreach语句为数组或对象集合中的每个元素重复一组嵌入式语句。

    3. 在foreach循环中,您不需要指定最小或最大的循环边界.---&gt; 在这里我们可以说这是每个循环的优势。

答案 10 :(得分:1)

C#中For和For每个循环之间的区别

  1. For循环执行代码块,直到表达式返回false为止,而ForEach循环通过对象集合中的项目执行代码块。

  2. For循环可以使用对象集合执行,也可以不使用任何对象集合,而ForEach循环只能使用对象集合执行。

  3. for循环是一种普通的循环结构,可用于多种用途,因为foreach只能在Collections或IEnumerables对象上使用。

答案 11 :(得分:0)

for和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.

答案 12 :(得分:0)

您可以将foreach用于像

这样的简单数组
int[] test = { 0, 1, 2, 3, ...};

您可以在拥有2D数组时使用for

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

答案 13 :(得分:0)

foreach 语法快速简便。 for 语法稍微复杂一点,但也更灵活。

迭代集合中的所有项目时,

foreach 非常有用。迭代整体或项目子集时, for 非常有用。

提供每个集合项的 foreach 迭代变量是READ-ONLY,因此我们无法在迭代时修改这些项目。使用 for 语法,我们可以根据需要修改项目。

底线 - 使用 foreach 快速迭代集合中的所有项目。使用进行迭代集合中项目的子集,或者在迭代时修改项目。

答案 14 :(得分:0)

就性能而言,我更喜欢FOR循环。当您携带更多物品时,FOREACH会有点慢。

如果对实例执行更多的业务逻辑,则FOREACH的执行速度更快。

演示: 我创建了一个10000000实例的列表,并使用FOR和FOREACH进行循环。

循环所需的时间:

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

下面是示例代码。

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; }
}

如果我取消注释循环中的代码: 然后,花了很多时间:

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

结论
如果您对实例执行更多的业务逻辑,则建议使用FOREACH。 如果您对实例的逻辑处理不多,则建议使用FOR。

答案 15 :(得分:0)

已经有很多答案,我只需要确定一个不存在的区别。

for循环是故障安全的,而foreach循环是快速故障的。

如果在对象中同时进行迭代和修改,那么快速迭代将抛出ConcurrentModificationException

但是,即使迭代进入无限循环,故障保护迭代也可以使操作免受失败的伤害。

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");
        }*/
    }
} 

希望这有助于了解for和foreach循环在不同角度上的区别。

如果有兴趣,我发现good blog会经历故障安全和故障快速之间的区别:

答案 16 :(得分:0)

for 循环重复执行一条语句或语句块,直到指定的表达式计算为false。

需要指定循环边界(最小或最大)。以下是一个简单的for循环的代码示例,该循环从0开始直到<= 5。

我们将详细介绍 foreach 。看起来像是外部的简单循环实际上是一个称为枚举器的复杂数据结构:

枚举器是具有 Current 属性, MoveNext 方法和 Reset 方法的数据结构。 Current 属性保存当前元素的值,每次调用 MoveNext 都会将枚举数前进到序列中的下一项。

枚举器很棒,因为它们可以处理任何迭代数据结构。实际上,它们是如此强大,以至于所有LINQ都建立在枚举器之上。

但是枚举器的缺点是它们要求对序列中的每个元素调用 Current MoveNext 。所有这些方法调用加起来,尤其是在关键任务代码中。

相反,for循环只需要为列表中的每个元素调用 get_Item 。这是一个比foreach循环少的方法调用,而且区别确实显示出来。

那么什么时候应该使用foreach循环,什么时候应该使用for循环?

这是您需要做的:

使用LINQ时,请使用foreach
当您处理非常大的值序列时,请使用foreach
如果性能不成问题,请使用foreach
但是,如果要获得最佳性能,请改用for-loop

答案 17 :(得分:-1)

foreach语句为数组中的每个元素或实现System.Collections.IEnumerable或System.Collections.Generic.IEnumerable接口的对象集合重复一组嵌入式语句。 foreach语句用于迭代集合以获取所需的信息,但不能用于添加或删除源集合中的项目以避免不可预测的副作用。如果需要在源集合中添加或删除项目,请使用for循环。

答案 18 :(得分:-2)

foreach 有关的重要一件事是,foreach迭代变量无法在循环体内被更新(或分配新值)。

例如:

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

              {

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

              }