Как я могу отсортировать по строковому свойству, но не по алфавиту - PullRequest
1 голос
/ 29 июля 2011

У меня есть объект, у которого есть строковое свойство, называемое «Статус». У меня есть коллекция этих объектов, и я хочу упорядочить коллекцию по этому полю, которое является строкой.

Возможные значения статуса:

«Открыть», «Закрыто», «Ожидание», поэтому я не могу использовать алфавитный порядок. Как лучше всего сказать, что "Open" больше, чем "Closed", который больше, чем "Pending"?

Я знаю, что есть интерфейс IComparer <>, но я хочу увидеть самый элегантный способ определения порядка различных строк.

Ответы [ 5 ]

3 голосов
/ 29 июля 2011

Как насчет использования Enum вместо строки?

     public enum Status
     {
        Pending,
        Closed,
        Open
      }

Затем открыть> Закрыто> В ожидании

Вы также можете использовать ответ Джона Скита для преобразования вашей строки в перечисление, если вы не можете изменить тот факт, что возвращаете строку.

1 голос
/ 29 июля 2011

Я думаю, что ваша проблема здесь в том, что вы пытаетесь навязать семантику классу string. На вашем месте я бы создал свой собственный объект статуса:

public class Status : IComparable
{
    private string statusText_ = string.Empty;
    private int priority_ = 0;

    public class Status(string text, int priority)
    {
        statusText_ = text;
        priority_ = priority;
    }

    // accessors ...


    public int CompareTo(object o)
    {
           // add compare logic to compare priorities here.
    }
}
1 голос
/ 29 июля 2011

Я бы создал отображение некоторой формы из строки в некое естественно сортируемое значение (например, целое число).

Тогда вы можете использовать:

var sorted = unsorted.OrderBy(x => ConvertStatusToInt32(x.Status));

В методе преобразования может использоваться статически инициализированный Dictionary, или переключатель, или что-то еще.

(Кстати, вы можете рассмотреть возможность использования enum - в идеале для вашего первоначального статуса. Таким образом вам вообще не нужно полагаться на строки.)

0 голосов
/ 29 июля 2011

Если это статический конечный набор опций, вы можете заменить строку перечислением и отсортировать по целочисленному значению перечисления.

0 голосов
/ 29 июля 2011

Вы можете определить порядок здесь:

string[] bestOrder = new string[] { "Open", "Closed", "Pending" };

Затем отсортируйте по индексу (т.е. IndexOf) рассматриваемой строки в bestOrder.

В зависимости от того, как высортировка кода будет отличаться .. но делегат для выполнения x => bestOrder.IndexOf(x) или аналогичный, вероятно, то, что вы хотите.

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