在C#中迭代遍历集合的所有元素之间的更快捷方式

时间:2013-12-09 14:18:33

标签: c# foreach

我使用的语言是C#。

我们有一个T

类型的对象列表
List<T> collection = new List<T>{.....};

假设我们想要查看每个收集项目。这可以通过多种方式完成。其中有以下两种:

foreach(var item in collection)
{
   // code goes here
}

foreach(T item in collection)
{
    // code goes here
}

第二种方式是否优于第一种方式?为什么?

提前感谢您的回答。

5 个答案:

答案 0 :(得分:24)

他们都完全一样。为方便起见,var是语法糖。它与遍历List的速度没有区别。

我遵循var的经验法则是仅在赋值的右侧存在对象的类型时使用它,所以在这种情况下我宁愿明确指定键入foreach以使其他工程师更清楚,但这取决于个人选择。如果将鼠标悬停在Visual Studio中的var上,它将显示该类型(假设它可以推断出应该是什么)。

答案 1 :(得分:8)

引用MSDN:

  

隐式类型的局部变量是强类型的,就像你一样   我自己声明了类型,但编译器确定了类型。

所以

var i = 10; // implicitly typed
int i = 10; //explicitly typed

完全相同。

现在,为了'更好' - 它将在很大程度上取决于你的参数来判断它。如果是速度,则for循环可能优于foreachT[]优于List<T>according to Patrick Smacchia。要点:

    List上的
  • for循环比List上的foreach循环便宜2倍多。
  • 在数组上循环比在List上循环便宜约2倍。
  • 因此,使用for循环on array比使用foreach在List上循环便宜5倍(我相信,这就是我们所做的)。

引用来源:In .NET, which loop runs faster, 'for' or 'foreach'?

参考:http://msdn.microsoft.com/en-us/library/bb383973.aspx

答案 2 :(得分:3)

如果您比较IL代码,那么您将看到它们实际上是100%相同。 var只是语法糖:

C#代码:

  List<int> collection = new List<int>();
  collection.Add(1);
  collection.Add(2);
  collection.Add(3);

  foreach (var myInt in collection)
  {
    Console.WriteLine(myInt);
  }

  foreach (var T in collection)
  {
    Console.WriteLine(T);
  }

 bool flag;

            System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>();
            list.Add(1);
            list.Add(2);
            list.Add(3);
            System.Collections.Generic.List<int>.Enumerator enumerator = list.GetEnumerator();
            try
            {
                while (flag)
                {
                    int i1 = enumerator.get_Current();
                    System.Console.WriteLine(i1);
                    flag = enumerator.MoveNext();
                }
            }
            finally
            {
                enumerator.Dispose();
            }
            enumerator = list.GetEnumerator();
            try
            {
                while (flag)
                {
                    int i2 = enumerator.get_Current();
                    System.Console.WriteLine(i2);
                    flag = enumerator.MoveNext();
                }
            }
            finally
            {
                enumerator.Dispose();
            }

答案 3 :(得分:1)

没有更快的方法来迭代同一个集合。

无论你使用什么,你自己的循环或扩展方法 - 这都是一样的。当你使用var时 - 它仍会编译成相同的东西。

唯一的区别可能是,如果您使用词典,在搜索值方面会比List<T>Collection更快。字典设计时带有搜索优化

答案 4 :(得分:0)

第一种方式(使用var)可能更好的可读性。 考虑一下:

List<User> list = new List<User>();
var users = list.GroupBy(x => x.Name).OrderBy(x => x.Key);
foreach (var user in users)
{
 //blah
}

VS

foreach (System.Linq.IGrouping<string, User> user in users)
{
}

我认为这是首先使用var的主要原因。