2014-02-20 5 views
1

У меня есть Windows.Forms.FlowLayoutPanel, который заполняется во время выполнения с помощью элементов управления типа MasterMeter (и управляет унаследованием от MasterMeter). Это ваш стандарт Usercontrol. Каждый из этих элементов управления имеет свойство ErrorTime. Это значение сохраняет длительность текущей ошибки или предупреждения.Элементы управления заказами внутри FlowLayoutpanel

Datetime? ErrorTime {get; set;} 

В настоящее время я пытаюсь заказать элементы управления с помощью bubblesort-method на основе длительности ошибки (по убыванию). Прямо сейчас мне было интересно, есть ли более быстрый/более эффективный/более надежный способ сделать это?

Если нет, есть ли другой контейнер, который я мог бы использовать? Она должна иметь следующие caracteristics:

  • Количество элементов может варьироваться
  • Количество элементов во время выполнения может изменяться от 0 до 100 (никогда не было более 100 ошибок, прежде чем ...)
  • ДОЛЖНА быть в состоянии содержать UserControls

Текущий код (который не разберется)

Я использую 1D-массива т o держать его простым (на самом деле его зубчатый массив). Примечание: possibilty из NULL значений

MasterMeter[] meterList = {new MasterMeter() { ErrorTime = null }, 
          new MasterMeter() { ErrorTime = DateTime.Now }, 
          new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-10) }, 
          new MasterMeter() { ErrorTime = DateTime.Now.AddDays(37) }, 
          new MasterMeter() { ErrorTime = DateTime.Now.AddDays(53) }, 
          new MasterMeter() { ErrorTime = DateTime.Now.AddDays(3) }, 
          new MasterMeter() { ErrorTime = null }, 
          new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-17) }, 
          new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-10) }, 
          new MasterMeter() { ErrorTime = null } 
          }; 

Я Bubblesorting следующим образом:

 for (int outer = 0; outer < meterList.Count(); outer++) 
     { 
      for (int inner = 0; inner < (meterList.Count() - 1); inner++) 
      { 
       if (meterList[inner].ErrorTime > meterList[inner + 1].ErrorTime) 
       { 
        var temp = meterList[inner + 1]; 
        meterList[inner + 1] = meterList[inner]; 
        meterList[inner] = temp; 
       } 
      } 
     } 

Мой результат Ouput (Использование Console.Writeline):

 foreach (MasterMeter meterlist in meterList) 
     { 
      Console.WriteLine(meterlist.ErrorTime); 
     } 
     Console.ReadLine(); 

Но мой массив еще ISN» t отсортировано. Что здесь происходит?

+0

Вы должны показать свой сортировочный код. – LarsTech

+0

Сделано! thnx за помощь – User999999

ответ

1

Вы должны решить, что делать с этими нулевыми значениями в списке, так как это мешает вашей пузырьковой сортировки:

if (!meterList[inner].ErrorTime.HasValue || 
    meterList[inner].ErrorTime > meterList[inner + 1].ErrorTime) { 

Что касается повторного упорядочения управления в FlowLayoutPanel, что код не хватает от вашего сообщения, но в целом вы использовали бы метод FlowLayoutPanel.Controls.SetChildIndex для повторного заказа своих элементов управления.

+0

Вот почему я ищу альтернативу bubblesort. Я могу установить нулевые значения в 'DateTime.MinValue', но я не уверен, что это путь. Однако ваш код дал мне представление. Я мог бы просто отфильтровать значения «null» и установить их в первую позицию. – User999999