Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> группировка с объединением 
V
    Опции темы
neiron
  Дата 27.8.2009, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: нет
Всего: 4



Добрался я и до LINQ. И сразу какую-то непонятность захотелось написать))

Есть 
Код

Dictionary<int, WrapperClass> dict

WrapperClass в своих корнях собственно содержит нужное свойство Type:
Код

MyEnum WrapperClass.MyClass.Type


Что мне собственно хочется - получить  сгруппированную по Type коллекцию.
Написал сейчас вот так:
Код

var collect = from s in dict
                       group s by s.Value.MyClass.Type into t
                       join shp in dict on t.Key equals shp.Value.MyClass.Type into shpe
                       orderby t.Cast<int>() select new {type = t, myObj= shpe};


При нахождении в dict одного элемента увидел в collect нечто похожее на правду. 
Добавляю второй объект - высыпается:
По крайней мере в одном объекте должен быть реализован интерфейс IComparable.

Быть может я в корне неверно поступаю и должен быть совсем другой подход?
 
Да, в итоге нужно будет этот collect ещё как то к TreeView wpf-ному привязать с узлами Type соответственно, что и есть основная задача.
PM MAIL   Вверх
mihryak
Дата 27.8.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 1
Всего: 36



а в каком виде тебе нужен результат?
Код

            var groupedSequences = dict.Values.GroupBy(s => s.Type)
                .OrderBy(g => g.Key)
                .Select(g => new {Type = g.Key, Values = g.ToList()});

этот код выдаст список объектов { Тип, список элементов }
Type, разумеется, должен реализовывать интерфейсы IEqualityComparer<Type> и IComparer<Type> или же в вызов GroupBy нужно будет передать экземпляр IEqualityComparer<Type>, а в OrderBy - IComparer<Type> (первому нужно иметь возможность проверять равенство, чтобы сгруппировать, второму - определять больше-меньше, чтобы упорядочить, оба интерфейса можно реализовать в одном классе)

Это сообщение отредактировал(а) mihryak - 27.8.2009, 12:09
PM MAIL ICQ   Вверх
neiron
Дата 27.8.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: нет
Всего: 4



По хорошему мне нужен результат в виде:
Type1
|-------WrapperClass1
|-------WrapperClass2
Type2
|-------WrapperClass5
|-------WrapperClass15
Type3
|-------WrapperClass3

Именно так должно выглядеть конечное дерево. Насколько я понимаю, приведённый пример как раз это и делает. 
Только не совсем понял 
Цитата

Type, разумеется, должен реализовывать интерфейсы IEqualityComparer<WrapperClass> и IComparer<WrapperClass>

Type, который есть MyClass.Type - это Enum обыкновенный. Не совсем понял где эти интерфейсы реализовывать? В самом WrapperClass? Так? Но мне, скорее всего, нужно будет в дальнейшем делать подобное приведение, но группируя и сортируя по другим полям. К примеру, наоборот - группировка по диапазону ID, а сортировка по Type и Id. Как то так.

Извиняюсь за большое непонимание, но с LINQ я ещё не разбирался конкретно. 
PM MAIL   Вверх
mihryak
Дата 27.8.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 1
Всего: 36



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

            var groupedSequences = dict.Values.GroupBy(t => t.Type).OrderBy(g => g.Key);

            foreach (var group in groupedSequences)
            {
                var type = group.Key;
                foreach (var test in group)
                {
                    ...
                }
            }

Цитата(neiron @  27.8.2009,  12:37 Найти цитируемый пост)
Type, который есть MyClass.Type - это Enum обыкновенный

для Enum ничего делать не надо, он и так может сравниваться на равенство и на больше-меньше, а вот для других свойств, особенно пользовательских типов, реализовывать скорее всего потребуется. Можно реализовать в самом типе или, если это кажется неудобным/некрасивым или сами эти проверки нигде, кроме, подобных выборок задействованы не будут, то сделать новый класс

PM MAIL ICQ   Вверх
neiron
Дата 27.8.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: нет
Всего: 4



Спасибо большое. Выборка работает на ура. Осталось её прикрутить к дереву. Но это уже не этой ветки обсуждение.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0722 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.