2015-07-06 5 views
0

У меня есть три таблицы хэша, заполненные доступными «задачами» для использования в разных контекстах, и у меня есть три одинаковых бита кода, кроме каждого из них используется другая хеш-таблица. Не идеально, и я хотел бы преобразовать это в функцию, но я борюсь с тем, как ссылаться на правильную хэш-таблицу.Используйте переменную, чтобы определить, какую другую переменную использовать

Так, в качестве примера, у меня есть это:

if ($global:machineTasks.ContainsKey($taskType))... 

, который повторяется три раза, для $machineTasks, $userTasks и $relocateTasks. Одним из способов подойти к нему, чтобы использовать switch и временный Hashtable, примерно так:

switch ($context) { 
     machine { 
      $workingTasks = $global:machineTasks 
     } 
     user { 
      $workingTasks = $global:userTasks 
     } 
     relocate { 
      $workingTasks = $global:relocateTasks 
     } 
    } 
if ($workingTasks.ContainsKey($taskType))... 

и работает нормально, но если Hashtables был действительно большой, что делает много избыточных данных. Итак, есть ли способ установить переменную, которая просто содержит имя используемой хеш-таблицы, а не всю хэш-таблицу, а затем использовать ее в if? В моем случае это, вероятно, не нужно, так как хэш-таблицы на самом деле довольно малы, менее 50 записей и каждая запись меньше 20 символов. Но, как упражнение по программированию, я хотел бы сделать это «правильно», и я предполагаю, что дублирующие данные не являются «правильными».

+1

это не дублируя эти таблицы просто создать ссылку на них Вы можете использовать 'Get-Variable' и хранить только имя, но это по-прежнему вызывает значение.. из памяти. – Matt

+0

Ага! Я забыл, что массивы и хеш-таблицы всегда всегда ByRef. Это, безусловно, дает решение здесь. И, я думаю, в ситуации, которая является просто переменной, копия ByVal не является серьезной проблемой. – Gordon

ответ

1

Если я не понимаю что-то, вы могли бы просто вставить ваши хэш-таблицы в другую хэш-таблицу:

$tasks = @{ 
    'machine' = @{ 
    'typeA' = ... 
    ... 
    } 
    'user' = @{ 
    'typeB' = ... 
    ... 
    } 
    'relocate' = @{ 
    'typeC' = ... 
    ... 
    } 
} 

и доступ к ним, как это:

if ($tasks[$context].ContainsKey($taskType)) { 
    ... 
} 
Смежные вопросы