Я думаю in
и ni
(п ВЗ я п) операторы, что вы должны смотреть. Они проверяют членство (или не членство) в списке. В этом случае:
if {$xorg ni {"t8405" "t9405" "t7805" "t8605" "t8705"}} {
puts "it wasn't in there!"
}
Если у вас есть много таких вещей, и часто тестирование, вы на самом деле лучше положить значения в ключи массива и используя info exists
:
foreach key {"t8405" "t9405" "t7805" "t8605" "t8705"} {
set ary($key) 1
}
if {![info exists ary($xorg)]} {
puts "it wasn't in there!"
}
Для этого требуется больше настроек, но на самом деле это происходит быстрее за каждый тест (особенно начиная с 8.5 и выше). Ускорение - это то, что массивы внутренне реализованы с использованием быстрых хеш-таблиц; поиск хэшей быстрее, чем сканирование по линейной таблице. Вы также можете использовать словари (приблизительно dict set
вместо set
и dict exists
вместо info exists
), но скорость похожа.
Окончательный вариант заключается в использовании lsearch -sorted
, если вы поместите этот список вещей в порядок, поскольку это переключается с линейного сканирования на двоичный поиск. Это также может быть очень быстрым и потенциально не требует затрат на установку (если вы сохраните список, отсортированный в первую очередь), но это вариант, который наименее ясен в моем опыте. (Оператор in
использует очень упрощена lsearch
внутренне, но только в режиме линейного сканирования.)
# Note; I've pre-sorted this list
set items {"t7805" "t8405" "t8605" "t8705" "t9405"}
if {[lsearch -sorted -exact $items $xorg] < 0} {
puts "it wasn't in there!"
}
Я обычно использую либо членства операторов (потому что они легко) или info exists
, если у меня есть удобный набор ключей массива. Я часто использую последнее на практике ...
'in' /' ni' делать сравнение с каждым элементом, но проще. Остальные два намного быстрее для больших коллекций, но нуждаются в дополнительной настройке для работы. ('lsort' может помочь с настройкой списка для' lsearch -sorted'.) –