为了账号安全,请及时绑定邮箱和手机立即绑定

C#中“ for”和“ foreach”控制结构的性能差异

C#中“ for”和“ foreach”控制结构的性能差异

婷婷同学_ 2019-10-28 14:47:49
哪个代码段可以提供更好的性能?以下代码段是用C#编写的。1。for(int counter=0; counter<list.Count; counter++){    list[counter].DoSomething();}2。foreach(MyType current in list){    current.DoSomething();}
查看完整描述

3 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

一个for循环被编译的代码大约相当于这个:


int tempCount = 0;

while (tempCount < list.Count)

{

    if (list[tempCount].value == value)

    {

        // Do something

    }

    tempCount++;

}

其中,将foreach循环编译为大致等效于此的代码:


using (IEnumerator<T> e = list.GetEnumerator())

{

    while (e.MoveNext())

    {

        T o = (MyClass)e.Current;

        if (row.value == value)

        {

            // Do something

        }

    }

}

正如您所看到的,这都取决于枚举器的实现方式以及列表索引器的实现方式。事实证明,基于数组的类型的枚举数通常是这样写的:


private static IEnumerable<T> MyEnum(List<T> list)

{

    for (int i = 0; i < list.Count; i++)

    {

        yield return list[i];

    }

}

正如您所看到的,在这种情况下,它并没有太大的区别,但是链表的枚举数可能看起来像这样:


private static IEnumerable<T> MyEnum(LinkedList<T> list)

{

    LinkedListNode<T> current = list.First;

    do

    {

        yield return current.Value;

        current = current.Next;

    }

    while (current != null);

}

在.NET中,您会发现LinkedList <T>类甚至没有索引器,因此您将无法在链表上进行for循环;但是如果可以的话,索引器的编写必须像这样:


public T this[int index]

{

       LinkedListNode<T> current = this.First;

       for (int i = 1; i <= index; i++)

       {

            current = current.Next;

       }

       return current.value;

}

如您所见,在循环中多次调用此方法要比使用可以记住它在列表中位置的枚举器慢得多。


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 780 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信