我正在尝试从现有的项目列表中创建一个新的数组/列表。我想检查项目是否先存在,如果不存在,则创建它然后为其添加值。如果它已经存在,只需附加一个值。我还需要一种方法来获得总数的长度。
set Area {23401 23402 23403}
foreach Item $Area {
set ElExist [info exist ${Item}lst]
if {$ElExist == 0} {
set ${Item}lst {};
lappend ${Item}lst $TotalRecords
} else {
lappend ${Item}lst $TotalRecords
}
set CurrentOptinon [llength ${Item}lst]
}
答案 0 :(得分:1)
如果我正在编写该代码,我会这样做:
set Area {23401 23402 23403}
foreach Item $Area {
upvar 0 ${Item}lst lst
lappend lst $TotalRecords
set CurrentOptinon [llength $lst]
}
这与您的代码的行为相同,但它的速度要短得多。这是使用中的技巧:
lappend
会创建一个变量(如果该变量尚不存在)。upvar 0
为变量创建一个本地别名。这么简单。别名消除了llength
魔法的需要,但你可以做到:
set CurrentOptinon [llength [set ${Item}lst]]
$
语法在很多方面只是调用set
单参数版本的快捷方式,读取命名变量。除非您编写set
,否则您可以在变量名中使用替换。根据经验,如果您在没有别名的变量中广泛使用变量名,那么您可能做错了(除非您确实需要名称)。
您正在使用奇怪的变量名称。更好的是阵列。
set Area {23401 23402 23403}
foreach Item $Area {
lappend lst($Item) $TotalRecords
set CurrentOptinon [llength $lst($Item)]
}
但是,这可能需要您在其他位置更改代码。