点击或拖拽改变大小

Functions.AScanBin 方法

X#
扫描已排序的数组,直到找到一个值或代码块返回0。

命名空间:  XSharp.RT
程序集:  XSharp.RT (在 XSharp.RT.dll 中) 版本:2.22 GA
语法
 FUNCTION AScanBin(
	aTarget AS ARRAY,
	uSearch AS USUAL
) AS DWORD
查看代码

参数

aTarget
类型:__Array
要扫描的已排序数组。
uSearch
类型:__Usual
要扫描的值。
除非此参数是代码块,否则它必须与aTarget中元素的数据类型匹配。
如果uSearch是代码块,它应返回一个数值,表示比较的结果:正值表示uSearch大于当前数组元素,0表示相等,负值表示uSearch小于当前数组元素。

返回值

类型:UInt32
如果uSearch是代码块,AScanBin()在代码块返回零值时返回元素的位置。
否则,AScanBin()返回匹配元素的位置。
如果存在多个相同的元素,由于AScanBin()使用二分查找算法,返回的匹配项不一定是编号最小的元素。
如果未找到匹配项,AScanBin()返回0。
备注
AScanBin()扫描数组以查找指定值。 如果uSearch是代码块,AScanBin()使用二分查找算法扫描aTarget,并对每个访问的元素执行代码块。
每遇到一个元素,AScanBin()将元素的值作为参数传递给代码块,然后对代码块执行Eval()。
当代码块返回零值或扫描范围内的元素耗尽时,扫描操作停止。 注意:值的比较使用=运算符。
对于精确匹配(即使用==运算符),请使用AScanBinExact()。
示例
此示例演示了使用字符串和代码块作为搜索条件扫描3元素数组。
代码块条件展示了如何执行不区分大小写的搜索:
X#
 1aArray := {"Tom", "Mary", "Sue"}
 2ASort(aArray)
 3? AScanBin(aArray, "Mary")                // 1
 4? AScanBin(aArray, "mary")                // 0
 5? AScanBin(aArray, ;
 6        {|x| MyCompare(x, "MARY")})        // 1
 7FUNCTION MyCompare(cElement, cSearch) AS SHORTINT
 8    LOCAL siRet := 0 AS SHORTINT
 9    cElement := Upper(cElement)
10    IF cSearch > cElement
11        siRet := 1
12    ELSEIF cSearch < cElement
13        siRet := -1
14        // ELSE默认为初始值0
15    ENDIF
16    RETURN siRet
参见