在多维数组中排序和删除重复项

时间:2017-07-17 06:08:56

标签: powershell

我有一个多维数组,想要按日期排序并删除重复的条目(按日期)。

$arrayPlaces = [System.Collections.ArrayList]@()

这就是Array的样子:

$arrayPlaces.Add(($mailBarcodeInformation[2], $mailScannedStart.Substring(22), "", "", "", "", "", ""))

以后填写空白字段。第二个字段$mailScannedStart.Substring(22)是时间,数组应按其排序,并且还应删除重复项。

我搜索了很多但找不到任何帮助。

1 个答案:

答案 0 :(得分:2)

一种常见的方法是将自定义对象添加到数组中并使用buit-in cmdlet sort -unique。它更具可读性:

$arrayPlaces = [System.Collections.ArrayList]@()
#.........
$arrayPlaces.Add([PSCustomObject]@{
    barcode = $mailBarcodeInformation[2]
    time = $mailScannedStart.Substring(22)
    foo1 = ''
    foo2 = ''
    foo3 = ''
}) >$null
#...........
$sorted = $arrayPlaces | sort time -Unique

但是,由于您已经使用了.NET类,因此可以切换到快速的.NET SortedDictionary,它会在添加项目时自动对集合进行排序和重复数据删除:

$arrayPlaces = [Collections.Generic.SortedDictionary[string,array]]@{}

添加和覆盖旧值:

$key = $mailScannedStart.Substring(22)
$arrayPlaces[$key] = $mailBarcodeInformation[2], $key, "", "", "", "", "", ""

使用密钥检查项目是否存在:

if ($arrayPlaces.ContainsKey($key)) { ....... }

卸下:

[void]$arrayPlaces.Remove('foo')

访问:

$items = $arrayPlaces['foo']
$item = $arrayPlaces['foo'][0]

枚举(更快):

foreach ($items in $arrayPlaces.Values) {
    # .........
}

枚举/流水线(较慢):

$arrayPlaces.Values | foreach { $_[0] = $_[1] + $[2] }