2013-08-01 30 views
9

Tôi gặp sự cố khi sắp xếp bảng băm. Tôi đã chia mã của mình thành những thứ cần thiết để không bị áp đảo bất cứ ai với kịch bản gốc của tôi.Sắp xếp bảng băm PowerShell trên thuộc tính giá trị

Write-Host "PowerShell Version = " ([string]$psversiontable.psversion) 
$h = @{} 
$Value = @{SortOrder=1;v1=1;} 
$h.Add(1, $Value) 
$Value = @{SortOrder=2;v1=1;} 
$h.Add(2, $Value) 
$Value = @{SortOrder=3;v1=1;} 
$h.Add(3, $Value) 
$Value = @{SortOrder=4;v1=1;} 
$h.Add(4, $Value) 

Write-Host "Ascending" 
foreach($f in $h.GetEnumerator() | Sort-Object Value.SortOrder) 
{ 
    Write-Host $f.Value.SortOrder 
} 

Write-Host "Descending" 
foreach($f in $h.GetEnumerator() | Sort-Object Value.SortOrder -descending) 
{ 
    Write-Host $f.Value.SortOrder 
} 

Đầu ra là

PowerShell Version = 3.0 
Ascending 
2 
1 
4 
3 
Descending 
2 
1 
4 
3 

Tôi chắc chắn đây chỉ là một trường hợp đơn giản vì không biết sử dụng chính xác Sort-Object. Các loại hoạt động chính xác trên Sort-Object Name vì vậy có lẽ nó có cái gì để làm với không biết làm thế nào để xử lý các Value.SortOrder?

Trả lời

19

Sort-Object chấp nhận tên thuộc tính hoặc khối tập lệnh được sử dụng để sắp xếp. Kể từ khi bạn đang cố gắng để sắp xếp trên một tài sản của một thuộc tính, bạn sẽ cần phải sử dụng một khối kịch bản:

Write-Host "Ascending" 
$h.GetEnumerator() | 
    Sort-Object { $_.Value.SortOrder } | 
    ForEach-Object { Write-Host $_.Value.SortOrder } 

Write-Host "Descending" 
$h.GetEnumerator() | 
    Sort-Object { $_.Value.SortOrder } -Descending | 
    ForEach-Object { Write-Host $_.Value.SortOrder } 

Bạn có thể lọc bằng cách sử dụng Where-Object cmdlet:

Write-Host "Ascending" 
$h.GetEnumerator() | 
    Where-Object { $_.Name -ge 2 } | 
    Sort-Object { $_.Value.SortOrder } | 
    ForEach-Object { Write-Host $_.Value.SortOrder } 

Bạn thường muốn đặt Where-Objecttrước bất kỳ số nào Sort-Object lệnh ghép ngắn vì nó giúp phân loại nhanh hơn.

+0

Tôi đã cập nhật câu hỏi của mình để sử dụng mã bạn đã đề cập nhưng tôi vẫn nhận được cùng một đầu ra. –

+0

nevermind có vẻ như tôi đã bỏ lỡ khoảng thời gian này. Tôi sẽ chỉnh sửa lại câu hỏi về bản gốc. –

+0

btw đây có thể là câu hỏi riêng biệt nhưng có cách dễ dàng để> = 2 hoặc một số bộ lọc khác. –

2

Tôi đã sử dụng bảng băm làm bảng tần số, để đếm sự xuất hiện của các từ trong tên tệp.

$words = @{} 
get-childitem *.pdf | foreach-object -process { 
    $name = $_.name.substring($_.name.indexof("-") + 1, $_.name.indexof(".") - $_.name.indexof("-") - 1) 
    $name = $name.replace("_", " ") 
    $word = $name.split(" ")[0] 
    if ($words.contains($word)){ 
     $words[$word] = $words[$word] + 1 
    }else{ 
     $words.add($word, 1) 
    } 
} 
$words.getenumerator() | sort-object -property value 

Đó là dòng cuối cùng thực hiện phép thuật, sắp xếp bảng băm trên giá trị (tần số).

+0

Đó là một câu trả lời tuyệt vời. Tôi đã poking xung quanh cho một vài giờ và nhìn thấy rất nhiều câu trả lời phức tạp, nhưng điều này hoạt động hoàn hảo. Làm tốt! Tôi cần sắp xếp trong một bảng băm, nhưng nó là một vấn đề đơn giản để đặt $ hashtable = {những gì bạn đã viết} và nó đã làm việc tuyệt vời. Cám ơn rất nhiều. – Alan