从列表项创建列表

时间:2014-09-03 08:02:05

标签: list tcl var

我正在尝试从现有的项目列表中创建一个新的数组/列表。我想检查项目是否先存在,如果不存在,则创建它然后为其添加值。如果它已经存在,只需附加一个值。我还需要一种方法来获得总数的长度。

    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]
    }

1 个答案:

答案 0 :(得分:1)

如果我正在编写该代码,我会这样做:

set Area {23401 23402 23403}
foreach Item $Area {
    upvar 0 ${Item}lst lst
    lappend lst $TotalRecords
    set CurrentOptinon [llength $lst]
}

这与您的代码的行为相同,但它的速度要短得多。这是使用中的技巧:

  1. lappend会创建一个变量(如果该变量尚不存在)。
  2. upvar 0为变量创建一个本地别名。这么简单。
  3. 别名消除了llength魔法的需要,但你可以做到:

    set CurrentOptinon [llength [set ${Item}lst]]
    

    $语法在很多方面只是调用set单参数版本的快捷方式,读取命名变量。除非您编写set,否则您可以在变量名中使用替换。根据经验,如果您在没有别名的变量中广泛使用变量名,那么您可能做错了(除非您确实需要名称)。

  4. 您正在使用奇怪的变量名称。更好的是阵列。

    set Area {23401 23402 23403}
    foreach Item $Area {
        lappend lst($Item) $TotalRecords
        set CurrentOptinon [llength $lst($Item)]
    }
    

    但是,这可能需要您在其他位置更改代码。