實現迴圈的三重境界

2021-06-19 19:49:30 字數 1454 閱讀 5776

王國維歪解宋詞,用它表達事業的三重境界。老譚要談談c#中編寫迴圈的三種方式,也來個東施效颦,不過是用唐詩來表達。王國維選擇宋詞,非常貼切,也給宋詞增色不少。老譚沒這水平,只是亂選一氣。

我們的例子是報表查詢:根據給定的關鍵字,查詢符合條件的報表,即報表名字是否和關鍵字相匹配。關鍵字的結構類似於google查詢:關鍵字中包含多個單詞,單詞由空格或加號隔開,空格表示或者,加號表示而且。

例如,如果關鍵字是二廠 三廠,那麼名字中含有二廠或三廠的報表都能匹配上,如果關鍵字是化工+**,那麼名字中既含有化工,又含有**的報表,才能匹配上。

我們要實現的函式是 bool ismatched(string reportname, string keyword)。

我們可以採用最為傳統的for迴圈實現這個函式:

private bool ismatched(string reportname, string keyword)

}if (allmatched)

}return false;

}

在這種方式下,為了實現迴圈,需要做相當多的額外工作:

定義迴圈控制變數,如i、j;

初始化迴圈控制變數,如設定為0;

定義迴圈控制變數的結束條件,如不超過專案個數;

每乙個迴圈步驟中調整迴圈控制變數的值,如加1;

根據迴圈控制變數獲取到要操作的物件等。

這些「額外」工作,遮蔽了要實現的邏輯,非常容易導致錯誤,如迴圈控制變數用混。

為了解決方式1中的諸多問題,c#新增了foreach關鍵字,支援新的迴圈實現方式。

private bool ismatched(string reportname, string keyword)

}if (allmatched)

}return false;

}

這種方式克服了方式1的缺點,迴圈控制不再凌亂,程式邏輯集中於處理迴圈變數上。這些變數,從集合中乙個個湧出,像滴著清響的竹露般利索。

c#採納了函式式程式設計的思路,和我們熟悉的命令式程式設計方式混合在一起,變成了一種混合式程式語言。

private bool ismatched(string reportname, string keyword)

這時,迴圈杳無蹤影。

利用c#操作集合時,要做好思路的轉換:從命令式(imperative)到函式式(functional)的轉換。這是乙個大題目,這裡只提本例子中用到的兩點:

明確做什麼,而不是怎麼做。如檢查集合中全部元素符合某個條件,用all(),檢查集合中是否有乙個元素符合某個條件,用any()。具體怎麼做,或者利用開發平台提供的支援,或者自己實現;

將函式作為引數。如any、all都是函式,同時也是引數。顯然,c#中是用λ-表示式做到這一點的。

人生三重境界

人生有三重境界,這三重境界可以用一段充滿禪機的語言來說明,這段語言便是 看山是山,看水是水 看山不是山,看水不是水 看山還是山。看水還是水。這就是說乙個人的人生之初純潔無瑕,初識世界,一切都是新鮮的,眼睛看見什 麼就是什麼,人家告訴他這是山,他就認識了山 告訴他這是水,他就認識了水。隨著年齡漸長,經...

人生三重境界

古今之成大事業 大學問者,必經過三種之境界 昨夜西風凋碧樹,獨上高樓,望盡天涯路 此第一境界也 衣帶漸寬終不悔,為伊消得人憔悴 此第二境界也 這三重境界可以用一段充滿禪機的語言 來說明。這段語言便是 看山是山,看水是水 看山不是山,看水不是水 看山還是山,看水還是水。第一階段 看山是山,看水是水。童...

BaseAdaPter的三重境界

逗比式 文藝式 普通式 1 逗比式 view view minflayer.inflate r.layout.item,null 存在缺點 重複創造view findviewbyid依然會浪費大量時間 逗比式 view view minflayer.inflate r.layout.item,nul...