Я действительно не проверял это, но я думаю, что это будет работать.
$ba = @{}
foreach ( $dep in $deps.GetEnumerator()) {
foreach ( $after in $dep.Value ) {
if ( $dep.Key -ne $after ) {
if ( -not $ba.ContainsKey( $dep.Key )) {
$ba[ $dep.Key ] = @{ $after=1 };
}
else {
$ba[ $dep.Key ].$after = 1;
}
}
if ( -not $ba.ContainsKey( $after )) {
$ba[ $after ] = @{}
}
}
}
Мне бы хотелось сделать это в конвейере, но я все еще изучаю все причуда.
Чтобы выполнить автовивификацию, которую выполняет Perl, я выбрал эту другую версию. Вы должны заметить, что я не могу add-member
, когда объявлено $ba
так, как указано выше.
$ba = new-object System.Collections.Hashtable;
$ba | add-member ScriptMethod deepset {
$p = $args;
if ( $p[0] -is [System.Array] ) {
$p = $p[0];
}
$p = [System.Collections.ArrayList]$p;
$last = $p.count - 1;
$val = $p[ $last ];
$p.RemoveAt( $last-- );
$key = $p[ $last ];
$p.RemoveAt( $last-- );
$lvl = $this;
foreach ( $k in $p ) {
if ( $lvl.containsKey( $k )) {
$old = $lvl.$k;
if ( $old -isnot [System.Collections.Hashtable] ) {
$lvl.$k = @{ '.' = $old };
}
}
else {
$lvl.$k = @{};
}
$lvl = $lvl.$k;
}
$lvl.$key = $val;
return;
}
# allowing the loop to be a bit shorter.
foreach ( $dep in $deps.GetEnumerator()) {
foreach ( $after in $dep.Value ) {
if ( $dep.Key -ne $after ) {
$ba.deepset( $dep.Key, $after, $true );
}
if ( -not $ba.ContainsKey( $after )) {
$ba[ $after ] = @{}
}
}
}