作者yauhh (姚呵呵)
看板Visual_Basic
标题Re: [.NET] 如何从阵列中取出非零的值
时间Thu Jul 3 06:03:33 2008
※ 引述《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)
1F:→ yauhh:p.s. 要使用这个特点, .net framwork版本要高一点 07/03 06:24
2F:→ yauhh:抱歉讲了错误的事,在此的函数委派本身不叫call-by-name 07/03 18:21
※ 编辑: yauhh 来自: 218.160.114.186 (07/03 18:23)
3F:→ aabcd2:感谢你 我会试试看的 07/04 02:23