2017-07-17 22 views
0

私は多次元配列を持ち、それを日付でソートし、重複したエントリを(日付で)削除します。多次元配列の重複をソートして削除する

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

、それは配列がどのように見えるかです:空のフィールドが、後に満たされている

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

。 2番目のフィールド$mailScannedStart.Substring(22)は時刻であり、配列はそれによってソートされ、重複も削除されます。

私は多くを検索しましたが、何の助けも見つかりませんでした。

答えて

2

一般的なアプローチは、カスタムオブジェクトを配列に追加し、buit-inコマンドレット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, "", "", "", "", "", "" 
を3210

そのキーを使用してアイテムの存在を確認する:

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

へのアクセス:削除

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

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

は(速い)の列挙:

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

列挙型/パイプライニング(遅い):

$arrayPlaces.Values | foreach { $_[0] = $_[1] + $[2] } 
関連する問題