Как определить порядок сортировки по умолчанию для классов, которые я создаю в powershell? - PullRequest
0 голосов
/ 30 апреля 2020

Я создал небольшой класс powershell

Class StatSummary {
    [String] $name
    [int] $errors = 0
}

Когда у меня есть коллекция экземпляров этого класса, я бы хотел, чтобы они по умолчанию сортировались в порядке возрастания (или убывания) по $ name. Я нахожу ссылку на свойства сортировки по умолчанию в документах о Sort-Object, но не могу найти пример того, как это сделать с моим собственным классом. Конечно, я могу заставить коллекцию сортироваться по-разному, передавая имена свойств в Sort-Object, но я также хотел бы определить значение по умолчанию. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 30 апреля 2020

Реализация интерфейса System.IComparable - для этого требуется только один метод, CompareTo():

Class StatSummary : IComparable {
    [String] $name
    [int] $errors = 0

    [int]
    CompareTo([object]$other)
    {
        return $this.name.CompareTo($other.name)
    }
}

В приведенном выше примере мы просто сравниваем свойство name:

PS C:\> 'Zoe', 'Andrew', 'Kate' |ForEach-Object {
>>   [StatSummary]@{ name = $_ }
>> } |Sort-Object |Select -Expand name
Andrew
Kate
Zoe

Но вы можете делать все, что вам нужно, например, сортировку по name, а затем по убыванию числа errors:

[int]
CompareTo([object]$other)
{
    $n = $this.name.CompareTo($other.name)
    if($n -eq 0){
        return -$this.errors.CompareTo($other.errors)
    }

    return $n
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...