21

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

在哪些场景中我们可以使用for而不是foreach,反之亦然。

可以用一个简单的程序显示吗?

两者在我看来都一样。我无法区分它们。

4

19 回答 19

24

循环是一种for结构,表示“执行此操作n. 次”。

循环是一个foreach结构,它说“对这个 IEnumerable中的每个值/对象执行这个操作”

于 2012-06-07T10:02:09.897 回答
12

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

于 2012-06-07T09:59:59.840 回答
11

我将尝试以更一般的方式回答这个问题:

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

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索引快得多(尤其是使用链表时)。

于 2012-06-07T10:07:46.550 回答
5

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

另一方面, for 比其他答案中显示的灵活得多。实际上,for 用于在指定条件为真时执行一个语句块。

来自微软文档:

for (initialization; test; increment)
     statement

初始化 必需。一种表达。这个表达式只执行一次,在循环执行之前。

测试 必需。一个布尔表达式。如果 test 为真,则执行语句。如果测试为假,则终止循环。

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

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

这意味着您可以以多种不同的方式使用它。经典的学校例子是从 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);
于 2012-06-07T10:32:10.200 回答
4

foreach几乎等同于:

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

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

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

一些派生点:

  • foreach不需要知道集合长度,因此允许遍历“流”或一种“元素生产者”。
  • foreach在迭代器上调用虚拟方法(大多数情况下),因此性能不如for.
于 2013-02-11T13:17:19.140 回答
4

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 ;
}
于 2012-06-07T10:19:11.113 回答
3

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

如果您正在遍历项目集合,并且不关心索引值,那么 foreach 更方便、更容易编写且更安全:您不会弄错项目数。

例如,如果您需要处理集合中的每隔一个项目,或者以相反的顺序处理它们,那么 for 循环是唯一实用的方法。

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

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

于 2014-05-12T11:01:45.093 回答
3

C# 中 For 和 For Each 循环的区别

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

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

  3. for 循环是一个普通的循环结构,可用于多种用途,其中 foreach 旨在仅在 Collections 或 IEnumerables 对象上工作。

于 2019-11-21T07:28:43.430 回答
2

如果您有一个数组或其他 IEnumerable 数据集合,则 foreach 很有用。但是 for 可用于访问可以通过索引访问的数组的元素。

于 2012-06-07T10:02:53.653 回答
2

当您提前知道或确定您希望循环运行多少次时,for 循环很有用。例如,如果您需要为一周中的每一天执行一个流程,您知道您需要 7 个循环。

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

于 2012-06-08T19:12:01.007 回答
2

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

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

我们详细看一下foreach。外表看起来很简单的循环,其实是一个复杂的数据结构,叫做枚举器:

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

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

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

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

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

这是您需要做的:

当你使用 LINQ 时,使用 foreach
当你处理非常大的计算值序列时,使用 foreach
当性能不是问题时,使用 foreach
但是如果你想要最高性能,使用 for 循环代替

于 2019-11-21T08:21:31.337 回答
1

就性能而言,我更喜欢 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。

于 2019-10-22T05:12:04.360 回答
1

许多答案已经存在,我只需要确定一个不存在的差异。

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 循环之间的区别。

如果有人感兴趣,我找到了一个很好的博客来了解故障安全和快速故障之间的区别:

于 2019-11-06T12:15:15.580 回答
1

c# 中 for 和 foreach 循环之间的主要区别我们通过它的工作来理解:

for 循环:

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

foreach 循环:

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

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

  3. 在 foreach 循环中,您不需要指定循环边界的最小值或最大值。---> 这里我们可以说这是 for each 循环的优点。

于 2016-09-05T13:37:06.910 回答
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.
于 2013-02-11T12:49:54.780 回答
0

您可以将 foreach 用于一个简单的数组,例如

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

当你有一个二维数组时,你可以使用 for

int[][] test = {{1,2,3,4},
                {5,2,6,5,8}};
于 2016-08-23T11:21:40.413 回答
0

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

当迭代集合中的所有项目时, foreach很有用。for在迭代整个项目或项目子集时很有用。

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

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

于 2017-06-03T03:41:57.303 回答
-1

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

于 2014-01-27T18:05:45.030 回答
-2

与foreach相关的一件重要事情是,foreach 迭代变量不能在循环体中更新(或分配新值)。

例如 :

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

              {

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

              }

于 2020-05-11T15:32:38.603 回答