看板 Visual_Basic 關於我們 聯絡資訊
※ 引述《aabcd2 (很無聊ing~)》之銘言: : 我想從陣列中 把其中非零的值抓出來存到其他變數中 : 然後做運算 : 該怎麼寫比較好 : 有沒有比較簡單的方法呢 當然有! .net程式可以使用 "委任" 函數,將重覆工作的主要部份交給它執行. 不過,寫起來不見得是簡單,只是概念上較簡單. 如果你有一個 List(Of Integer) ,其中可以使用一個方法叫做 FindAll(match As Predicate(Of Integer)) As List(Of Integer) 給一個條件當作參數 match, 它就幫你找到所有符合此條件的項目, 這些項目是另一個 List(Of Integer). 參數 match 是一個 Predicate(Of Integer), 顧名思義, 它是一個函數, 對一個整數做判斷,然後傳回判斷結果. 試試看,開啟一個 console application 專案,在主程式中寫: Dim a As New List(Of Integer) Dim p As New Predicate(Of Integer)(AddressOf ______) Dim i As Integer a.Add(1) a.Add(0) a.Add(2) a.Add(3) a.Add(0) For Each i In a.FindAll(p) Console.Write("{0} ", i) Next Console.ReadLine() 先做好 List a 與 Predicate p, 然後呼叫 a.FindAll(p) 就會得到答案. 不過, Predicate p 是個什麼東西還沒寫出來,所以上面在 AddressOf 右邊打底線, 那個位置應該填一個函數名稱,函數的型態是 f(a As Integer) As Boolean. (predicate就是一個判斷式,對一些參數做判斷,傳回 Boolean 值) 在此想要的函數是判斷一個數字是不是 0, 所以將上例第二行改為: Dim p As New Predicate(Of Integer)(AddressOf NotZero) 於是要定義一個名叫 NotZero 的函數: Function NotZero(ByVal a As Integer) As Boolean Return a <> 0 End Function 然後執行一下, a 是 {1,0,2,3,0}, a.FindAll(p) 則是 {1,2,3}. 這是較高階的方法,[對 Predicate p 一般稱作 Call-By-Name 或 Call-By-Need.] 另外, List(Of Integer) a 有一個 ForEach 方法為: Sub ForEach(action As Action(Of Integer)) 是對 a 的每個項目執行指定的程序 action. Action(Of Integer) 接受一個整數,然後做一個動作. 還有一個方法叫 ConvertAll: ConvertAll(conv As Converter(Of TInput, TOutput)) As List(Of TOutput) 是把一個函數 conv 套用到 a 的每個項目. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.231.64.34 ※ 編輯: yauhh 來自: 61.231.64.34 (07/03 06:15)
yauhh:p.s. 要使用這個特點, .net framwork版本要高一點 07/03 06:24
yauhh:抱歉講了錯誤的事,在此的函數委派本身不叫call-by-name 07/03 18:21
※ 編輯: yauhh 來自: 218.160.114.186 (07/03 18:23)
aabcd2:感謝你 我會試試看的 07/04 02:23