none
Сортировка при работе с ObservableCollection RRS feed

  • Вопрос

  • Имеется коллекция:

    public class TypeCollMax { public decimal Price { get; set; } public int Count { get; set; } } public static ObservableCollection<TypeCollMax> CollMax20tick;

    CollMax20tick = new ObservableCollection<TypeCollMax>();

    В коллекции 50 членов с разными ценами. Как получить самую часто встречающуюся цену? т е цену, с которой существует наибольшее количество элементов.Если 2 цены имеют одинаковое количество членов, то нужно взять большую из цен.

    Также нужно знать количество включений у этой цены.


    Eugene




    28 августа 2013 г. 16:25

Ответы

  • Это называется гистограмма.
    Для гистограммы Вы должны назначить интервалы,
    например, цена колеблется от 0 до 100,
    значит нужно назначить интервалы -
    0 - 9.99, 10 - 19.99, ..., 90 - 100.
    или какие-то иные, на Ваше усмотрение.
    Затем произвести выборку для каждого интервала,
    т.е. определить, сколько исходных значений попали в каждый интервал.
    Как определить количество исходных значений в каждом заданном интервале -

    List<int>IntervalLst=new List<int>{0,10,20,30,...};
    for (int i=0;i<IntervalLst.Count-1;i++)
    int I = Collection.Select(v=>v.Price>=IntervalLst[i] && v.Price<IntervalLst[i+1]).Count();



    • Изменено QazRdx 28 августа 2013 г. 16:54
    • Помечено в качестве ответа Евгений771 28 августа 2013 г. 17:45
    28 августа 2013 г. 16:51
  • В коллекции все это легко находится.

    double Max = Collection.Max(v=>v.Price);  // Аналогично Min
    int Count=Collection.Count;

    Полноценная гистограмма именно так и находится.
    По типу гистограммы определяется закон распределения -
    нормальный, логнормальный и пр.
    которыми характеризуется
    представительность данных,
    т.е. можно ли этим данным верить.

    • Помечено в качестве ответа Евгений771 28 августа 2013 г. 17:44
    28 августа 2013 г. 17:38

Все ответы

  • Это называется гистограмма.
    Для гистограммы Вы должны назначить интервалы,
    например, цена колеблется от 0 до 100,
    значит нужно назначить интервалы -
    0 - 9.99, 10 - 19.99, ..., 90 - 100.
    или какие-то иные, на Ваше усмотрение.
    Затем произвести выборку для каждого интервала,
    т.е. определить, сколько исходных значений попали в каждый интервал.
    Как определить количество исходных значений в каждом заданном интервале -

    List<int>IntervalLst=new List<int>{0,10,20,30,...};
    for (int i=0;i<IntervalLst.Count-1;i++)
    int I = Collection.Select(v=>v.Price>=IntervalLst[i] && v.Price<IntervalLst[i+1]).Count();



    • Изменено QazRdx 28 августа 2013 г. 16:54
    • Помечено в качестве ответа Евгений771 28 августа 2013 г. 17:45
    28 августа 2013 г. 16:51
  • Цена на рынке дискретна, с шагом tick. Мне нужно из 50 значений получить цену и Count самой частой цены. Получается в вашем случае я должен сначало найти максимум и минимум, затем определить Count цен и пройтись от минимума до максимума как по интервалам вашим методом.

    И в этом же цикле я должен искать максимум I  и запоминать цену при этом максимуме?


    Eugene

    28 августа 2013 г. 17:27
  • В коллекции все это легко находится.

    double Max = Collection.Max(v=>v.Price);  // Аналогично Min
    int Count=Collection.Count;

    Полноценная гистограмма именно так и находится.
    По типу гистограммы определяется закон распределения -
    нормальный, логнормальный и пр.
    которыми характеризуется
    представительность данных,
    т.е. можно ли этим данным верить.

    • Помечено в качестве ответа Евгений771 28 августа 2013 г. 17:44
    28 августа 2013 г. 17:38
  • Спасибо, очень помогли. А если Max нужен только первых 20 членов, то какая запись будет?



    Eugene





    28 августа 2013 г. 18:20
  • double Max = Collection.Take(20).Max(v=>v.Price);
    • Изменено QazRdx 28 августа 2013 г. 20:52
    28 августа 2013 г. 20:48
  • CountMaxPrice = MainWindow.CollMax20tick.Select(v => (v.Price == (MinCollTemp + (decimal)i * TickSymbolmin) ) ).Count();

    Делаю точку останова на строчку ниже. В коллекции 20 членов и есть с разными ценами, i=0, все типы decimal внутри Select.

    Но на выходе CountMaxPrice=20  Почему так получается? Мне нужно Count только избранных членов.


    Eugene



    30 августа 2013 г. 5:22
  • А что такое
    CollMax20tick,
    MinCollTemp,
    i,
    TickSymbolmin
    2 сентября 2013 г. 3:04
  • CollMax20tick-- это текущая коллекция.

    MinCollTemp-- минимальная цена в коллекции.

    i-- это от цикла перебора от минимальной до максимальной цены с шагом TickSymbolmin.

    У меня все получилось не с Select, а с Where. Но любопытно, как вы с Sekect все реализуете.


    Eugene

    3 сентября 2013 г. 6:54
  • Сорри, очепятка!
    Получилось, значит получилось!
    3 сентября 2013 г. 7:26