首頁>Program>source

假設我有以下代碼:

foreach(string str in someObj.GetMyStrings())
{
    // do some stuff
}

維兹威兹 在迴圈的每次迭代中被呼叫? 最好改為執行以下操作:

someObj.GetMyStrings()

List<string> myStrings = someObj.GetMyStrings(); foreach(string str in myStrings) { // do some stuff }
最新回復
  • 5月前
    1 #

    该函式仅呼叫一次,以返迴 IEnumerator<T> ; 在那之後, MoveNext() 方法和 Current 屬性用於遍歷結果:

    foreach (Foo f in GetFoos())
    {
        // Do stuff
    }
    

    等效於:

    using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
    {
        while (iterator.MoveNext())
        {
            Foo f = iterator.Current;
            // Do stuff
        }
    }
    

    請註意,迭代器放置在末尾-這對於从迭代器塊分配資源尤其重要,例如:

    public IEnumerable<string> GetLines(string file)
    {
        using (TextReader reader = File.OpenText(file))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }
    

    在上面的代碼中,您確實希望在完成迭代後關闭檔案,並且編譯器實現了 IDisposable

  • 5月前
    2 #

    否。该函式將被呼叫一次以获取IEnumerable ..然後將重複呼叫MoveNext和Current。

  • 5月前
    3 #

    GetMyStrings ()重新調整IEnumerable型別的物件.執行時知道如何處理.它先呼叫IEnumerable.GetEnumerator(),然後在该列舉器物件上呼叫MoveNext()和Current。

  • 5月前
    4 #

    只是為了解決問题,以防万一您陷入"所有相同"的情况。 for(int x = 0; x

  • python:使用ftplib下載目錄樹
  • size:在C中,為什麼'a'是一个整數,為什麼sizeof(char)1是?