tipabot
Интересующийся
Offline
|
|
« : 29-11-2010 16:39 » |
|
Всем привет У меня такой вопрос как лучше сделать. У меня есть List объектов. Тип объекта определяется моим классом. Мне надо сделать dll которая сортировала (групировала) этот List. На входе List объектов, на выходе отсортированный List. Для сортировки я использую LINQ (да удобная штука) но там существует привязка к типу данных, т.е. обязательно надо указывать тип данных или в запросе ну ли в переменной которая получает результат (если использовать var я его не передам между методами). Так вот как мне сделать dll которая сортировала данные различных типов не зная их объявления. Т.к. просто программу уже реализовал теперь весь функционал надо перекинуть в dll. пробовал использовать GetType(), но компилятор ругается о том что такого типа не существует (примерно так). Или такое не возможно. Прошу помочь
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 29-11-2010 20:00 » |
|
Непонятно, зачем тут LINQ, когда у List есть метод Sort. Туда нужно лишь передать компаратор, умеющий сравнивать твои объекты между собой.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
tipabot
Интересующийся
Offline
|
|
« Ответ #2 : 29-11-2010 21:16 » |
|
Спасибо за совет я про IComparer забыл. Но с одной стороны это решает проблему, но с другой вся реализация сортировки у нас находиться в самом классе и он является самодостаточным, тогда функции dll получается вызвать один класс (и то не реализованный в ней), получается бред и смысла в dll нет вообще. Может еще кто что подскажет дельного. Я не критекую я просто рассуждаю Кстати это не решает проблемы групировкибуду очень благодарен за помощь
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #3 : 29-11-2010 21:29 » |
|
Так вот как мне сделать dll которая сортировала данные различных типов не зная их объявления. Т.к. просто программу уже реализовал теперь весь функционал надо перекинуть в dll. Спасибо за совет я про IComparer забыл. Но с одной стороны это решает проблему, но с другой вся реализация сортировки у нас находиться в самом классе и он является самодостаточным, тогда функции dll получается вызвать один класс (и то не реализованный в ней), получается бред и смысла в dll нет вообще. Простите, но это полностью взаимоисключающие требования. DLL ничего не должна знать о сортируемом типе, значит, она не может содержать компаратора для этого типа. Сам тип при этом тоже не должен иметь компаратора. Как будете сортировать? Кстати это не решает проблемы групировки А можно ознакомиться с формулировкой этой проблемы? Я до сих пор не слышал о такой, и в первых постах о ней тоже ни слова.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
tipabot
Интересующийся
Offline
|
|
« Ответ #4 : 29-11-2010 21:53 » |
|
Простите, но это полностью взаимоисключающие требования. DLL ничего не должна знать о сортируемом типе, значит, она не может содержать компаратора для этого типа. да вы правы на счет этого я не спорю, походу dll будет прянут за уши. Компаратор просто я буду передовать в dll а не создавать там (в dll). Сам тип при этом тоже не должен иметь компаратора. Ну прийдется писать реализацию все таки в классе. А можно ознакомиться с формулировкой этой проблемы? Я до сих пор не слышал о такой, и в первых постах о ней тоже ни слова. У меня есть List объектов. Тип объекта определяется моим классом. Мне надо сделать dll которая сортировала (групировала) этот List. я писал, просто не заметно Может тоже какой-нибудь интерфейс есть для группировки по определенному полю, т.к. я все реализовал через LINQ
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #5 : 29-11-2010 22:02 » |
|
А теперь про пробовал использовать GetType(), но компилятор ругается о том что такого типа не существует (примерно так). Не представляю ситуацию, когда обращение к GetType() может вызвать ошибку компиляции. Можно подробнее, желательно с фрагментом исходного текста и точным текстом ругани компилятора?
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
tipabot
Интересующийся
Offline
|
|
« Ответ #6 : 29-11-2010 22:13 » |
|
приведу кусок кода где я пытался всунуть GetTypeэто метод который производит сортировку, AllFilms массив объектов static public List<FilmObject> ascendingSortingFunction(List<FilmObject> AllFilms, int numField) { Type t = AllFilms[0].GetType(); var sortedFilms = (from Object in AllFilms orderby Object.getID ascending select Object).ToList();
... ... ...
foreach (t k in sortedFilms) Console.WriteLine(k.getID); ... ... ...
} Добавлено через 5 минут и 52 секунды:блин Enter не чайно нажал вот log скорее всего это бред то что я написал
|
|
« Последнее редактирование: 29-11-2010 22:19 от tipabot »
|
Записан
|
|
|
|
Dale
|
|
« Ответ #7 : 30-11-2010 06:50 » |
|
Текст сообщения читали? Лично я не смог найти там упоминания GetType().
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #8 : 30-11-2010 08:51 » |
|
А я не понял, какова задача группировки. Если это задача удаления повторяющихся записей, то она решается элементарно. Если это задача выборка некоторых полей исходных объектов и записи их в новый объект со структурой, отличной от исходной, и затем уже удаление повторяющихся записей и/или вычисления агрегирующих функций для групп, то разумеется нужно заранее подумать о типе результата. Наконец, если GetID возвращает простой тип (скажем, int), то разумно выделить это свойство сортируемых объектов в отдельный интерфейс: interface IIdentified { int ID { get; } } На базе которого можно построить твой класс-хелпер: static class SortMaker { private static IComparer<int> comparer;
static SortMaker() { SortMaker.comparer = Comparer<int>.Default; }
public static void Sort(List<IIdentified> list) { list.Sort(new Comparison<IIdentified>(Compare)); }
private static int Compare(IIdentified x, IIdentified y) { return SortMaker.comparer.Compare(x.ID, y.ID); } }
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 30-11-2010 10:50 » |
|
Dale, было там: Type t = AllFilms[0].GetType(); ... foreach (t k in sortedFilms) Console.WriteLine(k.getID);
Только так нельзя. t - это Reflection-объект, описывающий тип, а не сам тип. Поскольку известно, что в List хранится FilmObject, то данное действие вовсе не нужно. Достаточно: static public List<FilmObject> ascendingSortingFunction(List<FilmObject> AllFilms, int numField) { var sortedFilms = (from Object in AllFilms orderby Object.getID ascending select Object).ToList(); /* ... */ foreach (FilmObject k in sortedFilms) { Console.WriteLine(k.getID); } /* ... */ }
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Dale
|
|
« Ответ #10 : 30-11-2010 12:36 » |
|
Dale, было там: Type t = AllFilms[0].GetType(); ... foreach (t k in sortedFilms) Console.WriteLine(k.getID);
Только так нельзя. t - это Reflection-объект, описывающий тип, а не сам тип. Ну такого я уж никак не ожидал, честно признаться... Пытался представить, для какого же типа объекта вызов GetType() мог бы дать ошибку.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
tipabot
Интересующийся
Offline
|
|
« Ответ #11 : 30-11-2010 21:39 » |
|
Я ж говорил что бред короче Dimka подкинул идею интерфейсов: 1. Первая DLL у меня будет Interface который объявляет новый тип данных; 2. Вторая DLL будет реализовывать сортировку(групировку) и тип данных который она будет принимать в качестве параметра конечно будет тип объявленный в первой DLL; 3. Будет просто оконное(консольное) приложение в котором будет использовать две первые dll. Будет действовать закон хочет использовать сортировку DLL будь добр реализуй интерфейс в классе объекты которого ты хочешь отсортировать Мне кажется так все проблемы снимаются по поводу незнания dll типа присылаемого ему значения (ну в нашем случае массива неизвестных объектов). жду критики
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #12 : 01-12-2010 08:12 » |
|
tipabot, а зачем 2 dll? Вообще зачем dll?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
tipabot
Интересующийся
Offline
|
|
« Ответ #13 : 01-12-2010 09:09 » |
|
Dimka такая задача вынести весь функционал в dll чтоб потом подрубать в других программах и использовать их функционал, такие же DLL надо создать на запись и чтение из файла, из базы и т.д.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #14 : 01-12-2010 12:21 » |
|
tipabot, тогда я всё равно не понял, зачем 2 dll. Ведь интерфейс нужен лишь для сортировки - разумно, когда это всё лежит в одной сборке.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
tipabot
Интересующийся
Offline
|
|
« Ответ #15 : 01-12-2010 13:25 » |
|
Ну или в одной наверно так логичней будет. Спасибо за совет.
|
|
|
Записан
|
|
|
|
|