C#における循環構造の効率問題



C#における循環構造の効率問題
 
引用する
順序、選択、サイクルはすべてのプログラムの3つの構造である.今日はサイクルの小さな問題についてお話しします.
内容
c#の循環構造は4種類あります.
  • for
  • while…do…
  • do…while…
  • foreach

  • この4つの構成において,いずれもループ終了の判断がある.ある数字より大きく、ある数字より小さく、あるいは他の条件式の判断です.今日は数字の判断についてお話しします.
    私たちの数字は定義された変数に格納されているか、集合の長さであるか、メソッドが返す情報である可能性があります.ここでは,ある方法の戻り情報について議論する.
    次の方法があると仮定し、戻り値はListである
    static List<int> GetIntList()
    {
         Console.WriteLine("  {0}   GetIntList  ",Counter);
         Counter++;
         return new List<int>(){
                    1,2,3,4,5};
    }

    この方法の戻り結果をループ処理する必要があり,最初はforループを例に挙げると多くの場合そう書かれていた.
     for (int i = 0; i < GetIntList().Count; i++)
     { 
     }

    後で知ったことが多くなったり、他の人の話を聞いたりして、自分の検証を経ました.このループ判定条件に問題があることが判明し,判定のたびにGetInListメソッドが呼び出され,極めて浪費される.次のように修正されます.
     int len=GetIntList().Count;
     for (int i = 0; i < len; i++)
     { 
     }

    まず変数を定義し、コレクションの長さを保存します.
    検証の結果,while...do,do...whileにも同様の問題があり,注意が必要である.
    集合内の各要素を処理する必要がある場合があります.foreachという便利な循環構造を選択します.彼は境界を越える問題を考慮しなくてもいいからです.上の検証結果から、下のコードに問題があるという人がいます.
     foreach (int i in GetIntList())
     { 
     }

    果たして問題はあるのだろうか.検証が必要です.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.Common;
    using System.Configuration;
    using MongoDB.Driver;
    using AutoTest.ServiceLocator;
    using System.Reflection;
    using AutoTest.Common;
    
    namespace AutoTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("------------------------------Begin------------------------------");
    
    
                Console.WriteLine("Foreach  ");
                Counter = 1;
                foreach (int i in GetIntList())
                { 
                }
                Console.WriteLine("For  ");
                Counter = 1;
                for (int i = 0; i < GetIntList().Count; i++)
                { 
                }
                Console.WriteLine("do...while...  ");
                Counter =1;
                int num=0;
                do
                {
                    num++;
                }
                while (num < GetIntList().Count );
                Console.WriteLine("while...do...  ");
                Counter = 1;
                num=0;
                while (num < GetIntList().Count)
                {
                    num++;
                };
         
                Console.WriteLine("------------------------------End------------------------------");
                Console.ReadKey();
    
            }
            static int Counter=1;
            static List<int> GetIntList()
            {
                Console.WriteLine("  {0}   GetIntList  ",Counter);
                Counter++;
                return new List<int>(){
                    1,2,3,4,5};
            }
        }
    
       
    }
    は実際に検証され、foreachは他の3つのサイクル構造とは異なり、重複するGetInListメソッド呼び出しは発生しないことが分かった.
     
    結論
    1、foreachは他の3つのサイクル構造とは違います.
    2、事実で話す必要がある.
     
    Technoratiラベル:
    ループ ,
    for ,
    foreach ,
    while