I am trying to create an array of HashSets but it always comes out as simply a HashSet. Here is a test script I made:
$arrHashSets = @();
$hs = New-Object System.Collections.Generic.HashSet[string];
$hs2 = New-Object System.Collections.Generic.HashSet[string];
$hs.Add("A");
$hs.Add("B");
$hs.Add("C");
$hs2.Add("A");
$hs2.Add("B");
$hs2.Add("C");
$arrHashSets = $hs;
$arrHashSets = $hs2;
Expected result:
$arrHashSets = [
{"A", "B", "C"},
{"A", "B", "C"}
]
Actual result:
$arrHashSets = {"A", "B", "C"}
I tried doing it a few different ways but $arrHashSets
always comes out as simply a HashSet rather than an array of type HashSet. What am I doing wrong?
CodePudding user response:
Replace:
$arrHashSets = $hs
$arrHashSets = $hs2
with:
$arrHashSets = $hs, $hs2
If you do need to build up an array(-like data structure) iteratively:
$lstHashSets = [System.Collections.Generic.List[object]]::new()
foreach ($thisHs in $hs, $hs2) {
$lstHashSets.Add($thisHs)
}
Note: For simplicity the generic list is [object]
-typed here, but you could more strictly type it as [System.Collections.Generic.List[System.Collections.Generic.HashSet[string]]]
.
However, creating an array / list explicitly isn't strictly needed, given that you can use a statement such as foreach
loop as an expression whose multiple outputs PowerShell implicitly captures in an array for you:
$arrHashSets = @(
foreach ($thisHs in $hs, $hs2) {
, $thisHs
}
)
Note:
@(...)
, the array-subexpression operator is necessary to ensure that an array is also constructed in the event that theforeach
loop happens to output only a single object.The unary form of
,
, the array constructor operator is used to in effect ensure that each hash set is output as a whole. By default, PowerShell would enumerate the hash set's entries, i.e. output them one by one - see this answer for more information.
As for what you tried:
Using =
to "extend" an array:
is generally to be avoided due to its inefficiency: a new array must be created behind the scenes every time - see this answer.
"adds" to the existing array by appending the elements of the RHS, if it is an enumerable, rather than appending the RHS as a whole. Thus, the hash set is enumerated and its elements become direct elements of the resulting, flat array.