none
Как выполнить сортировку Observable Collection RRS feed

  • Вопрос

  • public static void Sort<TSource, TKey>(this Collection<TSource> source, Func<TSource, TKey> keySelector)
    {
      List<TSource> sortedList = source.OrderBy(keySelector).ToList();
      source.Clear();
      foreach (var sortedItem in sortedList)
        source.Add(sortedItem);
    }

    public class CicleGramType
        {
            public decimal Price { get; set; }
            
            public int Volume { get; set; }
            
           
        }
    
    public static ObservableCollection<CicleGramType> MassivBar20tick;
    MassivBar20tick=new  ObservableCollection<CicleGramType>();
    
     

    Требуется , предположим, сортировка коллекции по свойству Price на убывание,  с максимального элемента по минимальный. Если можно 2 варианта, с записью в новую коллекцию и сохранение в существующую.

    Eugene


    23 августа 2013 г. 0:32

Ответы

  • Примерно так:

    class Program
    {
      public static ObservableCollection<CicleGramType> MassivBar20tick;
      static void Main(string[] args)
      {
        MassivBar20tick = new ObservableCollection<CicleGramType>();
        MassivBar20tick.Add(new CicleGramType() { Price = 1 });
        MassivBar20tick.Add(new CicleGramType() { Price = 4 });
        MassivBar20tick.Add(new CicleGramType() { Price = 2 });
        MassivBar20tick.Add(new CicleGramType() { Price = 3 });
    
        var newColl = new ObservableCollection<CicleGramType>(MassivBar20tick.OrderByDescending(i => i.Price));
      }
      
    }
    public class CicleGramType
    {
      public decimal Price { get; set; }
    
      public int Volume { get; set; }
    }

    А сохранение в существующую...уж лучше и выгоднее создать новую. Или так примерно:

    for(int i = 0; i < MassivBar20tick.Count; i++)
          {
            for(int j = MassivBar20tick.Count - 1; j > i; j--)
            {
              if(MassivBar20tick[j - 1].Price < MassivBar20tick[j].Price)
              {
                var x = MassivBar20tick[j - 1]; 
                MassivBar20tick[j - 1] = MassivBar20tick[j]; 
                MassivBar20tick[j] = x;
              }
            }
          }


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Евгений771 23 августа 2013 г. 10:13
    23 августа 2013 г. 5:53
    Модератор
  • Так например:

    class Program
    {
      public static ObservableCollection<CicleGramType> MassivBar20tick;
      static void Main(string[] args)
      {
        MassivBar20tick = new ObservableCollection<CicleGramType>();
        MassivBar20tick.Add(new CicleGramType() { Price = 1, Flag = false });
        MassivBar20tick.Add(new CicleGramType() { Price = 4, Flag = true});
        MassivBar20tick.Add(new CicleGramType() { Price = 2, Flag = true });
        MassivBar20tick.Add(new CicleGramType() { Price = 3, Flag = false });
    
        var newColl = new ObservableCollection<CicleGramType>
          (MassivBar20tick.OrderByDescending(i=> i.Flag).ThenByDescending(i => i.Price));
      }
    
    }
    public class CicleGramType
    {
      public decimal Price { get; set; }
      public int Volume { get; set; }
      public bool Flag { get; set; }
    }


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Евгений771 24 августа 2013 г. 17:29
    24 августа 2013 г. 9:03
    Модератор

Все ответы

  • Примерно так:

    class Program
    {
      public static ObservableCollection<CicleGramType> MassivBar20tick;
      static void Main(string[] args)
      {
        MassivBar20tick = new ObservableCollection<CicleGramType>();
        MassivBar20tick.Add(new CicleGramType() { Price = 1 });
        MassivBar20tick.Add(new CicleGramType() { Price = 4 });
        MassivBar20tick.Add(new CicleGramType() { Price = 2 });
        MassivBar20tick.Add(new CicleGramType() { Price = 3 });
    
        var newColl = new ObservableCollection<CicleGramType>(MassivBar20tick.OrderByDescending(i => i.Price));
      }
      
    }
    public class CicleGramType
    {
      public decimal Price { get; set; }
    
      public int Volume { get; set; }
    }

    А сохранение в существующую...уж лучше и выгоднее создать новую. Или так примерно:

    for(int i = 0; i < MassivBar20tick.Count; i++)
          {
            for(int j = MassivBar20tick.Count - 1; j > i; j--)
            {
              if(MassivBar20tick[j - 1].Price < MassivBar20tick[j].Price)
              {
                var x = MassivBar20tick[j - 1]; 
                MassivBar20tick[j - 1] = MassivBar20tick[j]; 
                MassivBar20tick[j] = x;
              }
            }
          }


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Евгений771 23 августа 2013 г. 10:13
    23 августа 2013 г. 5:53
    Модератор
  • У меня такой вариант выдает ошибку и не пойму как сделать:

    И подскажите, в вашем варианте вроде весь массив создается сразу, а не поэлементно.

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

    class Program
    {
      public static ObservableCollection<CicleGramType> MassivBar20tick;
    public static ObservableCollection<CicleGramType> MassivBar20tickSortD;
      static void Main(string[] args)
      {
        MassivBar20tick = new ObservableCollection<CicleGramType>();
        MassivBar20tick.Add(new CicleGramType() { Price = 1 });
        MassivBar20tick.Add(new CicleGramType() { Price = 4 });
        MassivBar20tick.Add(new CicleGramType() { Price = 2 });
        MassivBar20tick.Add(new CicleGramType() { Price = 3 });
    
    
    for(int i=0; i< MassivBar20tick.Count;i++)
    {
    CicleGramType TempSortD= new CicleGramType (){};
    MassivBar20tickSortD.Insert(0,TempSortD);
    
    
    }
    MassivBar20tickSortD=MassivBar20tick.OrderByDescending(i => i.Price));
     //Error
     }
      
    }
    public class CicleGramType
    {
      public decimal Price { get; set; }
    
      public int Volume { get; set; }
    }


    Eugene







    23 августа 2013 г. 6:28
  • Не совсем понял, что не подошло. Переменную лямбды вы можете просто заменить на любую другую.

    "Затем вместо  var newCall я записал имя коллекции MassivBar20tickSortD" - так потому что возвращается тип ObservableCollection<CicleGramType>.


    Сделаем содержимое сообщества лучше, вместе!

    23 августа 2013 г. 6:35
    Модератор
  • Просто мне нужна не локальная переменная, а которая определена ранее до конструктора или до тела программы. И лучше, чтобы уже инициализированная.

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

    Т е при сортировки new не желателен. Если только не создавать локальную var newColl и затем присваивать результаты сортировки поэлементно MassivBar20tickSortD.

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

    А равзе MassivBar20tickSortD не имеет требуемый тип?Сейчас сделал как у Вас и в цикле поэлементно присвоил MassivBar20tickSortD значения.


    Eugene




    23 августа 2013 г. 7:01
  • Вам определенно нужно прочитать эту книгу. НЕ РЕКЛАМА

    23 августа 2013 г. 7:09
  • скачал, посмотрю. Конечно не с Amazon.com))

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

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


    Eugene

    23 августа 2013 г. 7:24
  •  "... сортировка ... идет по дополнительному таймеру, раз в минуту..."

    При обработке минутных баров можно вообще ни о чем не беспокоиться -
    брать SortedDictionary и спокойно с ним работать - хватит за глаза.
    У меня сложнее - обращение к SortedDictionary происходит множество раз в секунду,
    из-за этого и проблемы.
    Никакие C#-сортировки эту мою проблему, видимо, не решат.
    Нужно, наверное, лепить на С++ что-то свое.

    "...всякая мелочь все всплывает и всплывает.."

    Вот и я уже давным-давно допилил,
    но все "всплывает и всплывает" на тестировании...
    Это бесконечно...
    • Изменено QazRdx 23 августа 2013 г. 10:48
    23 августа 2013 г. 10:28
  • Не подскажите, а как реализовать условие дополнительное, чтобы свойство Flag коллекции было true. Т е

    сортировка по одному свойству, но сортировать только те, которые имеют Flag==true. Остальные члены  значения не имеют. Т е их в конец или сортировать после сортировки первых, без разницы.


    Eugene


    24 августа 2013 г. 8:08
  • Так например:

    class Program
    {
      public static ObservableCollection<CicleGramType> MassivBar20tick;
      static void Main(string[] args)
      {
        MassivBar20tick = new ObservableCollection<CicleGramType>();
        MassivBar20tick.Add(new CicleGramType() { Price = 1, Flag = false });
        MassivBar20tick.Add(new CicleGramType() { Price = 4, Flag = true});
        MassivBar20tick.Add(new CicleGramType() { Price = 2, Flag = true });
        MassivBar20tick.Add(new CicleGramType() { Price = 3, Flag = false });
    
        var newColl = new ObservableCollection<CicleGramType>
          (MassivBar20tick.OrderByDescending(i=> i.Flag).ThenByDescending(i => i.Price));
      }
    
    }
    public class CicleGramType
    {
      public decimal Price { get; set; }
      public int Volume { get; set; }
      public bool Flag { get; set; }
    }


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Евгений771 24 августа 2013 г. 17:29
    24 августа 2013 г. 9:03
    Модератор