Как найти многозначное имя в хеш-таблице? - PullRequest
2 голосов
/ 06 мая 2011

Если у меня есть хеш-таблица с многозначным именем, как мне указать имя при поиске?

Вот несколько надуманных примеров ...

$unary = @{
    $false, "!A";
    $true,  "A"
}

$unary
Name                           Value
----                           -----
False                          !A
True                           A

$unary[$false]
!A
$unary[$true]
A

Пока все хорошо.

$binary = @{
  ($false, $false) = "!A and !B"
  ($false, $true)  = "!A and B"
  ($true,  $false) = "A and !B"
  ($true,  $true)  = "A and B"
}

$binary
Name                           Value
----                           -----
{False, True}                  !A and B
{True, False}                  A and !B
{True, True}                   A and B
{False, False}                 !A and !B

$binary[$false, $true]
//Nothing
$binary[($false, $true)]
//Nothing
$binary[{$false, $true}]
//Nothing
//www.stackoverflow.com... :)

Что мне нужно указать в $binary[...], чтобы получить значение?

Ответы [ 3 ]

4 голосов
/ 06 мая 2011

Ваша проблема в том, что вы используете массивы в качестве ключей в хэш-таблице. Просто чтобы проиллюстрировать, что здесь происходит не так:

PS Home:\> $x=$false,$false
PS Home:\> $y=@($binary.Keys)[0]
PS Home:\> $x
False
False
PS Home:\> $y
False
False
PS Home:\> $x.Equals($y)
False

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

Возможно, проще было бы использовать один объект в качестве ключа:

$binary = @{
  0 = "!A and !B"
  1  = "!A and B"
  10 = "A and !B"
  11  = "A and B"
}

или аналогичный. Затем извлечение

$binary[01]

даст "!A and B", как и ожидалось.

Обратите внимание, что у List будет та же проблема с равенством. Кортежи могут работать, но они недоступны в .NET 2.

2 голосов
/ 06 мая 2011

Это не очень честное решение, но в зависимости от того, что вы хотите сделать, оно может помочь.

$unary = new-object ‘object[]’ 2
$unary[$false] = "!A"
$unary[$true] = "A"

$binary= new-object ‘object[,]’ 2,2
$binary[$false,$false] = "!A and !B"
$binary[$false,$true] = "!A and B"
$binary[$true,$false] = "A and !B"
$binary[$true,$true] = "A and B"

Результат:

PS > $binary[$true,$true]
A and B
1 голос
/ 06 мая 2011

Наверное, не то, что вы хотели увидеть, но:

$binary = @{
  [string]($false,$true)  = "!A and B"
  [string]($true,$false) = "A and !B"
  [string]($true,$true)  = "A and B"
}

$binary[[string]($false,$true)]


!A and B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...