程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中,什麼時候用yield return,cf

C#中,什麼時候用yield return,cf

編輯:C#入門知識

C#中,什麼時候用yield return,cf


yield關鍵字用於遍歷循環中,yield return用於返回IEnumerable<T>,yield break用於終止循環遍歷。

 

有這樣的一個int類型的集合:

static List<int> GetInitialData()
        {
            return new List<int>(){1,2,3,4};
        }

需要打印出所有值大於2的元素。

 

  不使用yield return的實現

static IEnumerable<int> FilterWithoutYield()
        {
            List<int> result = new List<int>();
            foreach (int i in GetInitialData())
            {
                if (i > 2)
                {
                    result.Add(i);
                } 
            }
            return result;
        }

客戶端調用:

static void Main(string[] args)
        {
            foreach (var item in FilterWithoutYield())
            {
                Console.WriteLine(item);
            }
            Console.ReadKey(); 
        }

輸出結果:3,4

 

  使用yeild return實現

static IEnumerable<int> FilterWithYield()
        {
            foreach (int i in GetInitialData())
            {
                if (i > 2)
                {
                    yield return i;
                }
            }
            yield break;
            Console.WriteLine("這裡的代碼不執行");
        }

客戶端調用:

static void Main(string[] args)
        {
            foreach (var item in FilterWithYield())
            {
                Console.WriteLine(item);
            }
            Console.ReadKey(); 
        }

輸出結果:3,4

 

  總結

通過單步調試發現:

雖然2種方法的輸出結果是一樣的,但運作過程迥然不同。第一種方法,是把結果集全部加載到內存中再遍歷;第二種方法,客戶端每調用一次,yield return就返回一個值給客戶端,是"按需供給"。


第一種方法,客戶端調用過程大致為:

 

使用yield return,客戶端調用過程大致為:

 

使用yield return為什麼能保證每次循環遍歷的時候從前一次停止的地方開始執行呢?

--因為,編譯器會生成一個狀態機來維護迭代器的狀態。

 

簡單地說,當希望獲取一個IEnumerable<T>類型的集合,而不想把數據一次性加載到內存,就可以考慮使用yield return實現"按需供給"。


C語言中 ^怎使用

a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010

b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011

^異或運算符,位值相同0,1,見上示例.

//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面2條電路,2開關分別a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路a,b狀態相同時通[0],a,b同時通電[1].

C語言&& || !分別是什

&取址運算符作用提取變量地址
定義了變量編譯時系統內存分配空間
空間內存位置地址&提取地址
e.g int a;編譯時分配地址2000;&a2000
先定義了整型指針變量pp=&a;把a地址2000賦給p運行p=2000
scanf("%d",&a);當輸入3時會先根據&a知道a地址由地址找a內存空間再把3寫入空間
*指針運算符作用與&相反根據變量地址取出變量
*a變量a值3
下面定義和聲明指針小結
int *p; 定義指向整型數據指針
int *p[n]; 定義指針數組p由n指向整型數據指針元素組成
int (*p)[n]; p指向含n元素維數組指針變量
int *p(); p返回指針函數該指針指向整型數據
int (*p)(); p指向函數指針該函數返回整型值
int **p; p指針變量指向指向整型數據指針變量
想系統了解建議看看譚浩強《c程序設計》(第三版)本書通俗易懂學習c語言教材

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved