私はいくつかのXMLをソートしており、特定の固有でない要素を並べ替えることを希望しています。属性を使用すると、類似要素をグループ化できます。これらのグループ内では、私は元の順序を維持する必要があります。問題は、並べ替えるとき、これらのグループ内の順序が変更され、並べ替えると順序がもう一度変わるということです。私は、XMLの内容が変更されていなければ(もしそうでなければSVN diffsが醜い)ものを変更しないソートが必要です。ここでは簡単な例である:ここでは順序を変更するPowerShellのSort-Objectコマンドレットw.r.t.属性がソートされていない
$xml = [xml]@"
<root>
<element name="a" number="1" />
<element name="b" number="1" />
<element name="c" number="1" />
<element name="d" number="2" />
<element name="e" number="2" />
<element name="f" number="2" />
<element name="g" number="3" />
<element name="h" number="3" />
</root>
"@
Write-Host "`nFirst Sort produces this:"
$result1 = $xml.SelectNodes('//element') | Sort-Object -Property 'number'
Write-Host (($result1 | select -ExpandProperty 'number') + " <---Sorted on")
Write-Host (($result1 | select -ExpandProperty 'name') + " <---Order not maintained")
Write-Host "`nSorting the (already sorted) results of First Sort produces this:"
$result2 = $result1 | Sort-Object -Property 'number'
Write-Host (($result2 | select -ExpandProperty 'number') + " <---Sorted on")
Write-Host (($result2 | select -ExpandProperty 'name') + " <---Order changed again")
が出力されます。この例では
First Sort produces this:
1 1 1 2 2 2 3 3 <---Sorted on
c b a f e d h g <---Order not maintained
Sorting the (already sorted) results of First Sort produces this:
1 1 1 2 2 2 3 3 <---Sorted on
a b c d e f g h <---Order changed again
、私は「番号グループ」内のオリジナル「名前」順序を保存する必要があります。
を簡単にこれを元の順序を維持し、複数回ソートするときに出てくる方法はありますか?
元の順序を表すダミー属性の追加を避けようとしています。おそらく、より決定論的な別の.NETソート関数があるでしょうか?私は検索しましたが、同等のグループ内での注文には関係していないようでした。
ありがとうございました。特性の両方に関して
の構文を追加しましたか?たとえば、「ソートオブジェクト番号、名前」 –
残念ながら、元の順序を保持するために必要なものはありません(これらの順序は人間の意味です。これらは人が読んだ/編集するソースファイルです)。良い質問。 – Vimes
'Sort-Object'のドキュメントは安定した並べ替えを使用している場所を示していないので、それを期待する理由はありません。 – Joey