第二十九章 Caché 函數大全 $LISTFIND 函數
在指定的列表中搜索所需的值。
大綱
$LISTFIND(list,value,startafter)
$LF(list,value,startafter)
參數
- list 計算結果爲有效列表的表達式。列表是包含一個或多個元素的編碼字符串。必須使用
$LISTBUILD
或$LISTFROMSTRING
創建一個列表,或者使用$LIST
從另一個列表中提取一個列表。 - value 包含所需元素值的表達式。
- startafter 可選-解釋爲列表位置的整數表達式。搜索從該位置之後的元素開始;因此,0表示從位置1開始,1表示從位置2開始。startafter = -1是有效值,但始終不返回匹配項。僅使用startafter值的整數部分。
描述
$LISTFIND
在指定的列表中搜索請求值的第一個實例。匹配項必須精確且包含完整的元素值。字母比較區分大小寫。數字以規範形式進行比較。如果找到完全匹配的內容,則$LISTFIND
返回匹配元素的位置。如果找不到值,則$LISTFIND
返回0。
搜索從startafter參數指示的位置之後的元素開始。如果省略startafter參數,則$LISTFIND
假定startafter值爲0,並從第一個元素(元素1)開始搜索。
如果找不到匹配項,則$LISTFIND
返回0。如果startafter參數的值引用不存在的列表成員,則$LISTFIND
也將返回0。
可以使用$LISTVALID
函數來確定列表是否爲有效列表。如果列表不是有效列表,則系統生成<LIST>
錯誤。
如果startafter參數的值小於-1,則調用$LISTFIND
函數將產生錯誤。
Empty Strings 與 Empty Lists
$LISTFIND
函數可用於查找空字符串值,如以下示例所示:
DHC-APP> SET x=$LISTBUILD("A","","C","D")
DHC-APP> WRITE $LISTFIND(x,"") ; returns 2
2
$LISTFIND
可以與包含省略的元素的列表一起使用,但是不能用於定位省略的元素。下面的示例在列表中找到一個包含省略元素的值:
SET x=$LISTBUILD("A",,"C","D")
WRITE $LISTFIND(x,"C") ; returns 3
以下$LISTFIND
示例返回1:
DHC-APP> WRITE $LISTFIND($LB(""),"") ; returns 1
1
以下$LISTFIND
示例返回0:
DHC-APP>WRITE $LISTFIND("",""),!
0
DHC-APP>WRITE $LISTFIND($LB(),""),!
0
以下示例列表包含一個空列表,該空列表與包含數據的列表連接在一起。在空列表前添加將更改元素在最終的串聯列表中的列表位置:
/// d ##class(PHA.TEST.Function).LISTFIND()
ClassMethod LISTFIND()
{
SET x=$LISTBUILD("A","B","C","D")
WRITE $LISTFIND(x,"B"),! ; returns 2
WRITE $LISTFIND(""_x,"B"),! ; returns 2
WRITE $LISTFIND($LB()_x,"B"),! ; returns 3
WRITE $LISTFIND($LB(,,,)_x,"B") ; returns 6
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND()
2
2
3
6
但是,將空字符串連接到value對$LISTFIND
無效:
/// d ##class(PHA.TEST.Function).LISTFIND1()
ClassMethod LISTFIND1()
{
SET x=$LISTBUILD("A","B","C","D")
WRITE $LISTFIND(x,"B"),! ; returns 2
WRITE $LISTFIND(x,"B"_""),! ; returns 2
WRITE $LISTFIND(x,""_"B"),! ; returns 2
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND1()
2
2
2
示例
以下示例返回2,即所請求的字符串首次出現的位置:
DHC-APP>SET x=$LISTBUILD("A","B","C","D")
DHC-APP>WRITE $LISTFIND(x,"B")
2
下面的示例返回0,指示找不到請求的字符串:
DHC-APP>SET x=$LISTBUILD("A","B","C","D")
DHC-APP>WRITE $LISTFIND(x,"E")
0
以下示例顯示了使用startafter參數的效果。第一個示例找不到請求的字符串並返回0,因爲該字符串出現在startafter位置:
DHC-APP>SET x=$LISTBUILD("A","B","C","D")
DHC-APP>WRITE $LISTFIND(x,"B",2)
0
第二個示例查找請求的字符串的第二個出現並返回4,因爲第一個出現在startafter位置之前:
DHC-APP>SET y=$LISTBUILD("A","B","C","A")
DHC-APP>WRITE $LISTFIND(y,"A",2)
4
$LISTFIND
函數僅匹配完整的元素。因此,以下示例返回0,因爲列表中的所有元素都不等於字符串“B”,儘管所有元素都包含“B”:
DHC-APP>SET mylist = $LISTBUILD("ABC","BCD","BBB")
DHC-APP>WRITE $LISTFIND(mylist,"B")
0
以下數字示例均返回0,因爲數字在匹配之前已轉換爲規範形式。在這些情況下,字符串數字值和規範形式號不匹配:
/// d ##class(PHA.TEST.Function).LISTFIND2()
ClassMethod LISTFIND2()
{
SET y=$LISTBUILD("1.0","+2","003","2*2")
WRITE $LISTFIND(y,1.0),!
WRITE $LISTFIND(y,+2),!
WRITE $LISTFIND(y,003),!
WRITE $LISTFIND(y,4)
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND2()
0
0
0
0
以下數字示例匹配,因爲數字值以規範形式進行比較:
/// d ##class(PHA.TEST.Function).LISTFIND3()
ClassMethod LISTFIND3()
{
SET y=$LISTBUILD(7.0,+6,005,2*2)
WRITE $LISTFIND(y,++7.000),! ; returns 1
WRITE $LISTFIND(y,0006),! ; returns 2
WRITE $LISTFIND(y,8-3),! ; returns 3
WRITE $LISTFIND(y,--4.0) ; returns 4
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND3()
1
2
3
4
以下示例均返回0,因爲指定的startafter值不匹配:
/// d ##class(PHA.TEST.Function).LISTFIND4()
ClassMethod LISTFIND4()
{
SET y=$LISTBUILD("A","B","C","D")
WRITE $LISTFIND(y,"A",1),!
WRITE $LISTFIND(y,"B",2),!
WRITE $LISTFIND(y,"B",99),!
WRITE $LISTFIND(y,"B",-1)
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND4()
0
0
0
0
以下示例顯示瞭如何使用$LISTFIND
查找嵌套列表。請注意,Caché將多元素嵌套列表視爲具有列表值的單個列表元素:
DHC-APP> SET y=$LISTBUILD("A",$LB("x","y"),"C","D")
DHC-APP> WRITE $LISTFIND(y,$LB("x","y"))
2