12 3 3 3 在 C 中使用平面對映

2021-06-28 11:25:46 字數 1999 閱讀 9068

12.3.3.3 在 c# 中使用平面對映

類似於 collect 函式的linq 運算子,是 selectmany,但兩者之間也有差異,因為 linq 有不同的要求。而 f# 序列表示式只能使用 collect 函式表示,linq 查詢可以使用許多其它運算子,所以,對於序列操作,它們需要不同的方式。

我們再先看一下普通語法,然後,再考慮轉換成使用顯式擴充套件方法的語法,我們還使用前面的 f# 示例的資料。有關國家資訊的城市列表中包含了 cityinfo 類的例項,有兩個屬性,輸入名字的列表只包含字串。清單 12.13 展示的是我們寫的 linq 查詢,查詢輸入城市所屬的國家。

清單 12.13 使用查詢找出輸入城市的國家 (c#)

var q =

from e in entered     [1]

from known in cities     [2]

where known.city == e                                | [3]

select string.format(" ()", known.city, known.country);  |

這個查詢表示式與我們在前面示例中所實現的完全相同,它遍歷兩個資料來源(entered [1] 和 cities [2]),我們交叉聯接兩個集合,然後,只產生與使用者輸入城市名,在「已知的城市」列表中相對應的城市記錄;最後,格式化輸出[3]。

在 c# 查詢表示式語法中,我們也可以使用 jion 子句,直接指定兩個資料來源的鍵(在我們的例子中,是值 e 和 known.city 值)。也有一些不同:join 子句可能更有效,但是,幾個 from 子句更靈活。特別是,我們生成的第二個序列可能會根據我們當前看到的第乙個序列中的專案。

正如我們剛才所說的,查詢表示式可以轉換為正常的成員呼叫。在查詢表示式中,第乙個 from 子句之後的任何 from 子句,都被轉換成對 selectmany 的呼叫。清單 12.14 顯示了由 c# 編譯器執行的轉換。

清單 12.14 查詢轉換成運算子呼叫 (c#)

var q = entered

.selectmany(

e=> cities,     [1]

(e, known) => new )     [2]

.where(tmp => tmp.known.city == tmp.e)   |

.select(tmp => string.format(" ()",     | 篩選,格式化輸出

tmp.known.city, tmp.known.country));   |

不像在 f # 中,if 條件被巢狀在兩個 for 迴圈中(平面對映),在 c# 中的操作是沒有巢狀的順序組合。首先是 selectmany 運算子,實現聯接;篩選和對映,在序列的末尾用 where 和 select 執行。

第乙個 lambda 函式[1],為源列表中的每個專案生成指定集合,這個引數對應於提供給 f# 的 collect 函式的引數值的函式。在查詢中,返回所有已知的城市,所以,操作只執行聯接,而沒有任何篩選,或進一步地處理。第二個引數[2]指定如何根據原始序列的中元素生成結果,由函式所返回的新生成的序列中的元素。在示例中,我們用包含了兩個專案的匿名型別,這樣,我們就可以在以後的查詢運算子使用它們。

在 f# 中,所有的處理是在篩選和對映(filtering projection,外國人也能這樣並列使用名字了,要麼就應該是平面對映)內部做的,這樣,我們只返回最終的結果。在 c# 中,大多數處理在後面完成,所以,我們需要返回兩個元素,再組合成乙個值(使用匿名型別),使它們能在以後訪問。通常,第乙個 from 子句指定主查詢源,如果我們新增更多的 from 子句,它們通過 selectmany 運算子,與原始的資料來源聯接。任何後續的運算子,比如,where 和 select,都只能加到最後,處理聯接好的資料來源。這不同於 f# 轉換,因為在 f# 中,篩選和對映都巢狀在最裡面,呼叫 seq.collect。

理解如何轉換並不是那麼重要,但是,下一節我們還是要作一點了解。我們將會看到,f# 序列表示式表示更普通的想法,也可以在一定程度上使用 linq 查詢來表示;我們已經看到的平面對映將發揮關鍵作用。

在C 中使用Queue

介紹 queue類執行將放在在queue中的物件採用先進先出的資料結構。物件從一端插入到佇列中從另一端移除。物件的順序程序使用queue queue介面 queue類實現了三個主要集合介面 icollection ienumerable和icloneable。queue的重要方法 queue類常用的...

在 C 中使用畫筆

出處 在 c 中使用畫筆 public class rectangle shape protected point m start protected point m end public rectangle point start,point end,color fgcolor m start s...

在 C 中使用 Python script

想要在c 中嵌入script 除了自己寫指令碼引擎外,lua,python 都可以在c 中使用,另外 monobind,angelscript library 都是一些c script library,可以嵌入到c 中使用 今天在c 中試著嵌入 python 示例 在 python 2.5.2 de...