C # динамически выбирает атрибут для сортировки - PullRequest
0 голосов
/ 26 ноября 2010

У меня есть массив с объектами, теперь мне нужно их отсортировать.

У меня есть этот метод:

public Int32 CompareTo(object next)
        {
            SessionInfo nextCase = (SessionInfo)next;
            return (this.Duration.CompareTo(nextCase.Duration));
        }

Теперь мне нужно динамически изменить значение сортировки с «Длительность» на «Имя». Поэтому я сделал атрибут с именем SortColumn и присвоил ему значение «Продолжительность»

Теперь мой код выглядит так:

public string SortColumn { get; set; }

public SessionInfo()
    {
        SortColumn = "Duration";
    }

public Int32 CompareTo(object next)
    {
        SessionInfo nextCase = (SessionInfo)next;
        return (this.SortColumn.CompareTo(nextCase.SortColumn));
    }

Это не работает. Есть ли способ изменить столбец для сортировки?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 26 ноября 2010

Вместо arraylist, почему бы не использовать общий список, тогда вы получаете сортировку бесплатно (почти):

var list = new List<SesionInfo>(); // then add items
list.Sort((s1,s2) => s1.SortColumn.CompareTo(s2.SortColumn));
2 голосов
/ 26 ноября 2010
public int CompareTo(object next)
{
    SessionInfo nextCase = (SessionInfo)next;
    if(SortColumn == "Duration")
        return (this.Duration.CompareTo(nextCase.Duration));
    else if(SortColumn == "Name")
        return (this.Name.CompareTo(nextCase.Name));
}
0 голосов
/ 26 ноября 2010

Да, я бы согласился, всегда используйте общий список для такого рода функций, поскольку вы получаете следующие преимущества,

  • Тип безопасности
  • Лучшая производительность
  • Нет необходимости явного приведения
  • Лучшие алгоритмы роста.

С уважением,

Сал Заки

0 голосов
/ 26 ноября 2010

Причина, по которой он не работает, заключается в том, что он сортирует по значению свойства SortColumn, и все объекты в вашей коллекции имеют одинаковое значение для этого. Один из способов ее решения - использовать отражение, чтобы получить значение свойства, названного свойством SortColumn.

public Int32 CompareTo( object next )
{
      SessionInfo nextCase = next as SessionInfo;
      var sortProperty = this.GetType().GetProperty( this.SortColumn );

      var currentValue = sortProperty.GetValue( this ) as IComparable;
      var nextValue = sortProperty.GetValue( next ) as IComparable;

      return currentValue.CompareTo( nextValue );
}

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

Лучшим решением было бы использовать общий список и расширение OrderBy. Тогда вы можете просто сделать:

var sorted = collection.OrderBy( c => c.Duration );

или

var sorted = collection.OrderBy( c => c.Name );

Если вы используете Dynamic LINQ , то вы можете указать столбец по имени.

var sorted = collection.OrderBy( "Duration" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...