• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Javen-Studio 咖啡小屋

            http://javenstudio.org - C++ Java 分布式 搜索引擎
            Naven's Research Laboratory - Thinking of Life, Imagination of Future

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              24 隨筆 :: 57 文章 :: 170 評論 :: 4 Trackbacks

            3.3         延遲的查詢賦值(Deferred Query Evaluation

            機敏的讀者(Observant readers)可能注意到標準的 Where 操作符在 C# 2.0 介紹里是用 yield 構造(construct)實現的。這是所有的標準操作符返回(return)有序列的數據(sequences of values)所采用的共同的實現技術。yield 關鍵詞的用途有個很有趣的好處,就是查詢實際是直到迭代結束(iterated over)后才被賦值的,即使是 foreach 語句或者手工使用下面(underlying)的 GetEnumerator MoveNext 方法也是如此。這種延遲的賦值方式允許查詢像基于 IEnumerable<T> 值(IEnumerable<T>-based values)一樣保留著,在每次 yield 方式返回可能不同的結果(yielding potentially different results)的時候可以被賦值多次(evaluated multiple times)。

             

            對許多應用程序來說,這是期望(desired)得到的準確的行為(is exactly the behavior)。對應用程序想緩存查詢賦值的結果,ToList ToArray 這兩個操作符提供用來強制查詢的直接賦值(force the immediate evaluation),以返回一個含有查詢賦值的結果的 List<T> 或者Array 數組。

             

            為了解延遲查詢賦值是怎么工作的,請考察下面一段簡單地查詢一個數組的程序:

             

            // declare a variable containing some strings
            string[] names = "Allen""Arthur""Bennett" };

            // declare a variable that represents a query
            IEnumerable<string> ayes = names.Where(s => s[0== 'A');

            // evaluate the query
            foreach (string item in ayes) 
              Console.WriteLine(item);

            // modify the original information source
            names[0= "Bob";

            // evaluate the query again, this time no "Allen"
            foreach (string item in ayes) 
                Console.WriteLine(item);

             

            查詢在每次變量 ayes 迭代結束(iterated over)時賦值。為了顯示需要對結果做一份緩存的copy,我們可以簡單給這個查詢附加上一個 ToList 一個 ToArray 操作符,如下所示:

             

            // declare a variable containing some strings
            string[] names = "Allen""Arthur""Bennett" };

            // declare a variable that represents the result
            // of an immediate query evaluation
            string[] ayes = names.Where(s => s[0== 'A').ToArray();

            // iterate over the cached query results
            foreach (string item in ayes) 
                Console.WriteLine(item);

            // modifying the original source has no effect on ayes
            names[0= "Bob";

            // iterate over result again, which still contains "Allen"
            foreach (string item in ayes)
                Console.WriteLine(item);

             

            ToList ToArray 都強制查詢的賦值,就像執行一個標準查詢操作符(如 First, ElementAt, Sum, Average, All, 等)返回一個單獨的值(singleton values)一樣。

             


            待續, 錯誤難免,請批評指正,譯者Naven 2005-10-22

            posted on 2005-10-23 00:08 Javen-Studio 閱讀(744) 評論(1)  編輯 收藏 引用

            評論

            # re: 延遲的查詢賦值(Deferred Query Evaluation) 2005-10-23 18:57 Ninputer
            看來我不僅是機敏的讀者,而且還試圖用真協同機制來實現和迭代完全同步的查詢。只是還有一點點小問題。。。  回復  更多評論
              

            久久综合88熟人妻| 久久久久一级精品亚洲国产成人综合AV区| 香蕉久久夜色精品国产2020 | 国产精品乱码久久久久久软件| 一本色道久久88综合日韩精品 | 久久艹国产| 波多野结衣中文字幕久久| 欧美一级久久久久久久大片| 丰满少妇高潮惨叫久久久| 伊人色综合久久天天人守人婷| 久久久久久久尹人综合网亚洲| 久久婷婷国产剧情内射白浆| 99久久www免费人成精品| 色婷婷综合久久久久中文| 国产精品久久婷婷六月丁香| 久久人人爽人人爽人人片AV麻豆 | 中文字幕日本人妻久久久免费 | 久久精品中文字幕第23页| 久久精品一本到99热免费| 久久亚洲中文字幕精品一区| 久久精品99无色码中文字幕| 欧美激情精品久久久久| 97久久香蕉国产线看观看| 久久久久久亚洲AV无码专区| 久久久久国产精品人妻| 人妻系列无码专区久久五月天| 精品国产综合区久久久久久| 久久夜色tv网站| 99久久国产综合精品成人影院 | 丁香色欲久久久久久综合网| 噜噜噜色噜噜噜久久| 亚洲Av无码国产情品久久| 久久久久综合国产欧美一区二区 | 亚洲中文字幕久久精品无码APP | 久久久久四虎国产精品| 狠狠久久亚洲欧美专区| 青青草原综合久久大伊人精品| 亚洲天堂久久精品| 欧美日韩精品久久久久| 久久夜色精品国产亚洲| 久久亚洲国产成人精品性色|