Если вам нужен список кортежей, я бы порекомендовал создать список из кортежей :
$list = @()
$tuple1 = New-Object 'Tuple[String,String]' 'dog', 'cat'
$tuple2 = New-Object 'Tuple[String,String]' 'dog', 'horse'
$list += $tuple1
$list
# Output:
#
# Item1 Item2 Length
# ----- ----- ------
# dog cat 2
$list += $tuple2
$list
# Output:
#
# Item1 Item2 Length
# ----- ----- ------
# dog cat 2
# dog horse 2
Обратите внимание, что в этом примере $list
- это обычный массив, что означаетчто, как указал @ mklement0 в своем ответе, добавление к нему с помощью оператора присваивания +=
создаст массив с размером, увеличенным на 1, поместит новый элемент в новый пустой слот, затемзаменить оригинальный массив.Для небольшого числа операций добавления это обычно не представляет большой проблемы, но с увеличением количества операций добавления влияние на производительность становится значительным.
Использование ArrayList
вместо простого массива позволяет избежать этой проблемы:
$list = New-Object Collections.ArrayList
$tuple1 = New-Object 'Tuple[String,String]' 'dog', 'cat'
$tuple2 = New-Object 'Tuple[String,String]' 'dog', 'horse'
$list.Add($tuple1) | Out-Null
$list
# Output:
#
# Item1 Item2 Length
# ----- ----- ------
# dog cat 2
$list.Add($tuple2) | Out-Null
$list
# Output:
#
# Item1 Item2 Length
# ----- ----- ------
# dog cat 2
# dog horse 2
Метод Add()
объектов ArrayList
выводит индекс, к которому был добавлен элемент.Out-Null
подавляет вывод, который в большинстве случаев нежелателен.Если вы хотите работать с этими индексными числами, вы можете собрать их в переменную вместо того, чтобы отбрасывать их ($i = $list.Add($t1)
).
Если вы хотите избежать необходимости указывать тип нового кортежа все времяможет обернуть его в многократно используемую функцию, например:
function New-Tuple {
Param(
[Parameter(Mandatory=$true)]
[ValidateCount(2,2)]
[string[]]$Values
)
New-Object 'Tuple[String,String]' $Values
}
$tuple1 = New-Tuple 'dog', 'cat'
$tuple2 = New-Tuple 'dog', 'horse'
или, более общим образом, например:
function New-Tuple {
Param(
[Parameter(
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true
)]
[ValidateCount(2,20)]
[array]$Values
)
Process {
$types = ($Values | ForEach-Object { $_.GetType().Name }) -join ','
New-Object "Tuple[$types]" $Values
}
}
$tuples = ('dog', 'cat'), ('dog', 'horse') | New-Tuple