Сортировка производительности объекта IComparable в C # - PullRequest
0 голосов
/ 19 августа 2010

Я разработал класс, который по сути является ничем иным, как объектом, который хранит большое количество свойств фрагмента данных. Я реализовал IComparable в классе. Объекты класса создаются и хранятся в списке.

Существует дополнительный уровень сложности в том, что определенные поля объекта определяют, по каким полям я сортирую (существует иерархия). Таким образом, иерархия:

  • 1) Имя (определено при создании экземпляра)
  • 2) Продукт (определяется при создании экземпляра)
  • 3) NetGroup (определено после создания, после первоначального создание списка повторюсь назад выполнить расчет и установить группу.)
  • 4) Дата (определяется при создании экземпляра)

Существует несколько флагов (полей bool), которые определяют, используются ли два из вышеперечисленных в иерархии сортировки.

  • 5) AllowProductGroupingInd (определено при создании)
  • 6) AllowDateGroupingInd (определено в конкретизация)

Производительность сортировки в относительно небольшом списке (n = 1000) низкая, обычно около 500 мс.

Я не уверен, правильно ли реализовал мой компаратор. Мой метод выглядит так:

    public int CompareTo(Exposure rfpe)
            {
                if (Name.CompareTo(rfpe.Name) != 0)
                    return Name.CompareTo(rfpe.Name);
                else
                {
                    if (AllowProductGroupingInd == false)
                    {
                        if (ProductId.CompareTo(rfpe.ProductId) != 0)
                            return ProductId.CompareTo(rfpe.ProductId);
                    }

                    if (NetGroup.CompareTo(rfpe.NetGroup) != 0)
                        return NetGroup.CompareTo(rfpe.NetGroup );
                    else if (AllowDateGroupingInd == false)
                    {
                        if (Date.CompareTo(rfpe.Date) != 0)
                            return Date.CompareTo(rfpe.Date);
                        else
                            return 0;
                    }

                    return 0;
                }

            }

Я использую C # 3.0, поэтому я не могу использовать LINQ. Это разумная реализация того, что я хочу достичь? Есть ли более элегантное решение? Мне кажется, я могу использовать слишком много условных выражений, но я не уверен, как обойти это.

1 Ответ

0 голосов
/ 19 августа 2010

Вы, кажется, дважды вызываете каждый из вспомогательных CompareTo методов, первый из которых, скорее всего, является основным виновником производительности.

int nameCompare = Name.CompareTo(rfpe.Name);

if (nameCompare != 0)
   return nameCompare;
else
   ...
...