【问题标题】:Multiarray with one entry [duplicate]一个条目的多数组[重复]
【发布时间】:2017-01-11 19:36:15
【问题描述】:

如果我在 PowerShell 中有一个包含一个条目的多数组,我将对数组进行排序,它会将行数从 1 更改为 3。但如果我在多数组中有多个条目,它将保持相同的行数排序后的行。

PS C:\Users\user> $a = ,("2", "A", "Urs")

PS C:\Users\user> $a
2
A
Urs

PS C:\Users\user> $a.Count
1

PS C:\Users\user> $a = $a | Sort-Object

PS C:\Users\user> $a
2
A
Urs

PS C:\Users\user> $a.Count
3

PS C:\Users\user> $a = ,("2", "A", "Urs")

PS C:\Users\user> $a.Count
1

PS C:\Users\user> $a += ,("3", "B", "Max")

PS C:\Users\user> $a
2
A
Urs
3
B
Max

PS C:\Users\user> $a.Count
2

PS C:\Users\user> $a = $a | Sort-Object

PS C:\Users\user> $a.Count
2

【问题讨论】:

  • 问题写得很好,但我投票结束,因为它有 already been asked 并且 cmets 和答案中有许多解决方案

标签: powershell


【解决方案1】:

有道理

$a = ,("2", "A", "Urs")
$a.Count

$a 上面是多数组,其中只有一个元素,所以计数为 1

$a 下面是包含三个元素的数组

$a = $a | Sort-Object
$a.Count

【讨论】:

  • 是的,但是为什么要将 Multiarray 更改为“正常”数组,因为我正在对其进行排序?我认为它应该对数组中的数组进行排序。如果我在多数组中有两个以上的元素,它将计算两个,而不是排序后的六个。
  • 这里的问题在于排序对象,它适用于单个数组。但是对于多维数组,您需要执行类似 $a | 的操作排序对象@{Expression={$_[1]};升序=$True} | %{ "$($_[0]),$($_[1])" }
  • 但是在我这样排序之后,我将再次得到一个字符串而不是一个数组。
【解决方案2】:

抱歉,我没有足够的声誉来添加评论而不是回答。

你所有的问题都是因为管道而发生的。 管道从流中收集它们的结果。从流中,您无法判断管道返回的是单例还是集合。所以你的一个元素的二维数组变成了一维的。

【讨论】:

  • 数组声明写错了。它仍然是一个字符串。请始终具体回答。 :)
  • 拜托,你能解释一下数组声明有什么问题吗?正如我所见,$a 的类型和 $a[0] 的类型是数组。所以我们真的有二维数组。但是管道(排序对象)由于其实现的特性而打破了这一点。
  • 它是一个二维数组。您可以使用 $a[0][0] 对其进行测试,但在将其排序为 $a[0]
  • @AnnSorokina :数组声明应该用@() 括起来。如果您仍然认为您正在获取第一个索引中的数据,因为 PS 有能力获取特定变量的数组中的内容。这就是为什么第 0 个索引会给你结果。
  • @ChristianFrei:不,它永远不是二维数组,也不是 C 会给你这样的结果。在 PS 中,如果它的多维数组,则必须枚举 arraylist 内的元素。并选择相应的值。
【解决方案3】:

我做了一个不好的解决方法,但它有效...

$newarray = New-Object System.Collections.ArrayList
$newmultiarray = New-Object System.Collections.ArrayList
$a = ,("test", "3333", "peter", "peter2")
$a += ,("rrrr", "8888", "max", "rhzzh")

$stringlist = $a | Sort-Object @{Expression={$_[0]}; Ascending=$True} | %{ "$($_[0]),$($_[1]),$($_[2]),$($_[3])" }

$arraymulti =$stringlist -split "[\r\n]"

foreach ($i in $arraymulti){
    $array = $i -split ","
        foreach ($y in $array){
            [void]$newarray.Add($y)
        }
    [void]$newmultiarray.Add($newarray)
    $newarray = New-Object System.Collections.ArrayList
    }

$newmultiarray

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多