点击或拖拽改变大小

Functions.AScan 方法 (__Array, __Usual, __Usual)

X#
扫描数组直到找到一个值或代码块返回 TRUE。

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

参数

aTarget
类型:__Array
要扫描的数组。
uSearch
类型:__Usual
要扫描的值。
除非此参数是代码块,否则它必须与 aTarget 中元素的数据类型匹配。
nStart
类型:__Usual
起始元素。
负值从末尾开始。
如果 nCount 为正,默认值为1;如果 nCount 为负,默认值为数组的长度。

返回值

类型:UInt32
如果 uSearch 是代码块,AScan() 返回代码块返回 TRUE 的第一个元素的位置。
否则,AScan() 返回第一个匹配元素的位置。
如果未找到匹配项,AScan() 返回 0。
备注
如果 uSearch 不是代码块,其值会与第一个目标元素比较。
如果不匹配,AScan() 继续处理数组中的下一个元素。
此过程持续进行,直到找到匹配项或扫描范围内的元素耗尽。
如果 uSearch 是代码块,AScan() 扫描 aTarget,对每个访问的元素执行代码块。
每遇到一个元素,AScan() 将元素的值作为参数传递给代码块,然后对代码块执行 Eval()。
当代码块返回 TRUE 或扫描范围内的元素耗尽时,扫描操作停止。 注意:值的比较使用 = 运算符。
对于精确匹配(即使用 == 运算符),请使用 AScanExact()。
示例
此示例演示了扫描一个3元素数组,同时使用字符串和代码块作为搜索条件。
代码块条件展示了如何执行不区分大小写的搜索:
X#
1aArray := {"Tom", "Mary", "Sue"}
2? AScan(aArray, "Mary")                // 2
3? AScan(aArray, "mary")                // 0
4? AScan(aArray, ;
5        {|x| Upper(x) = "MARY"})    // 2
此示例演示了在找到匹配项后扫描搜索参数的多个实例:
X#
 1LOCAL aArray := {"Tom", "Mary", "Sue", "Mary"}
 2LOCAL nStart := 1
 3LOCAL iAtEnd, iPos AS INT
 4// 获取数组最后一个元素的位置
 5iAtEnd := 4
 6DO WHILE (iPos := AScan(aArray, "Mary", nStart)) > 0
 7    ? iPos, aArray[iPos]
 8    // 获取新的起始位置并测试边界条件
 9    IF (nStart += iPos) > iAtEnd
10        EXIT
11    ENDIF
12ENDDO
此示例使用代码块扫描二维数组。注意,代码块中的参数 aVal 是一个数组:
X#
1LOCAL aArr := {}
2AAdd(aArr,{"one", "two"})
3AAdd(aArr,{"three", "four"})
4AAdd(aArr,{"five", "six"})
5? AScan(aArr, {|aVal| aVal[2] = "four"})        // 2
参见