Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Пользовательские типы и dll в C#  (Прочитано 18402 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
tipabot
Интересующийся

by
Offline Offline

« : 29-11-2010 16:39 » 

Всем привет
У меня такой вопрос как лучше сделать.

У меня есть List объектов. Тип объекта определяется моим классом. Мне надо сделать dll которая
сортировала (групировала) этот List. На входе List объектов, на выходе отсортированный List. Для сортировки я использую LINQ (да удобная штука) но там существует привязка к типу данных, т.е. обязательно надо указывать тип данных или в запросе ну ли в переменной которая получает результат (если использовать var я его не передам между методами).

Так вот как мне сделать dll которая сортировала данные различных типов не зная их объявления. Т.к. просто программу уже реализовал теперь весь функционал надо перекинуть в dll. пробовал использовать GetType(), но компилятор ругается о том что такого типа не существует (примерно так). Или такое не возможно. Прошу помочь  Здесь была моя ладья...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 29-11-2010 20:00 » 

Непонятно, зачем тут LINQ, когда у List есть метод Sort. Туда нужно лишь передать компаратор, умеющий сравнивать твои объекты между собой.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
tipabot
Интересующийся

by
Offline Offline

« Ответ #2 : 29-11-2010 21:16 » 

Спасибо за совет я про IComparer забыл.  Класс!
Но с одной стороны это решает проблему, но с другой вся реализация сортировки у нас находиться в самом классе и он является самодостаточным, тогда функции dll получается вызвать один класс (и то не реализованный в ней), получается бред и смысла в dll нет вообще. Может еще кто что подскажет дельного.
Я не критекую я просто рассуждаю   Да-да

Кстати это не решает проблемы групировки
буду очень благодарен за помощь Здесь была моя ладья...
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 29-11-2010 21:29 » 

Так вот как мне сделать dll которая сортировала данные различных типов не зная их объявления. Т.к. просто программу уже реализовал теперь весь функционал надо перекинуть в dll.
Спасибо за совет я про IComparer забыл.  Класс!
Но с одной стороны это решает проблему, но с другой вся реализация сортировки у нас находиться в самом классе и он является самодостаточным, тогда функции dll получается вызвать один класс (и то не реализованный в ней), получается бред и смысла в dll нет вообще.

Простите, но это полностью взаимоисключающие требования. DLL ничего не должна знать о сортируемом типе, значит, она не может содержать компаратора для этого типа. Сам тип при этом тоже не должен иметь компаратора. Как будете сортировать?

Кстати это не решает проблемы групировки

А можно ознакомиться с формулировкой этой проблемы? Я до сих пор не слышал о такой, и в первых постах о ней тоже ни слова.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
tipabot
Интересующийся

by
Offline Offline

« Ответ #4 : 29-11-2010 21:53 » 

Цитата
Простите, но это полностью взаимоисключающие требования. DLL ничего не должна знать о сортируемом типе, значит, она не может содержать компаратора для этого типа.
да вы правы на счет этого я не спорю, походу dll будет прянут за уши. Компаратор просто я буду передовать в dll а не создавать там (в dll).

Цитата
Сам тип при этом тоже не должен иметь компаратора.
Ну прийдется писать реализацию все таки в классе.


Цитата
А можно ознакомиться с формулировкой этой проблемы? Я до сих пор не слышал о такой, и в первых постах о ней тоже ни слова.

Цитата
У меня есть List объектов. Тип объекта определяется моим классом. Мне надо сделать dll которая
сортировала (групировала) этот List.

я писал, просто не заметно   Улыбаюсь Может тоже какой-нибудь интерфейс есть для группировки по определенному полю, т.к. я все реализовал через LINQ



Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 29-11-2010 22:02 » 

А теперь про

пробовал использовать GetType(), но компилятор ругается о том что такого типа не существует (примерно так).

Не представляю ситуацию, когда обращение к GetType() может вызвать ошибку компиляции. Можно подробнее, желательно с фрагментом исходного текста и точным текстом ругани компилятора?
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
tipabot
Интересующийся

by
Offline 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
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 30-11-2010 06:50 » 

Текст сообщения читали? Лично я не смог найти там упоминания GetType().
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 30-11-2010 08:51 » 

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

Наконец, если GetID возвращает простой тип (скажем, int), то разумно выделить это свойство сортируемых объектов в отдельный интерфейс:
Код: (C#)
    interface IIdentified
    {
        int ID
        {
            get;
        }
    }
На базе которого можно построить твой класс-хелпер:
Код: (C#)
    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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 30-11-2010 10:50 » 

Dale, было там:

Цитата: tipabot
Type t = AllFilms[0].GetType();
...
foreach (t k in sortedFilms)
            Console.WriteLine(k.getID);

Только так нельзя. t - это Reflection-объект, описывающий тип, а не сам тип.

Поскольку известно, что в List хранится FilmObject, то данное действие вовсе не нужно. Достаточно:
Код: (C#)
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
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 30-11-2010 12:36 » new

Dale, было там:

Цитата: tipabot
Type t = AllFilms[0].GetType();
...
foreach (t k in sortedFilms)
            Console.WriteLine(k.getID);

Только так нельзя. t - это Reflection-объект, описывающий тип, а не сам тип.

Ну такого я уж никак не ожидал, честно признаться... Пытался представить, для какого же типа объекта вызов GetType() мог бы дать ошибку.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
tipabot
Интересующийся

by
Offline Offline

« Ответ #11 : 30-11-2010 21:39 » 

Я ж говорил что бред короче  Отлично
Dimka подкинул идею интерфейсов:

1. Первая DLL у меня будет Interface который объявляет новый тип данных;
2. Вторая DLL будет реализовывать сортировку(групировку) и тип данных который она будет принимать в качестве параметра конечно будет тип объявленный в первой DLL;
3. Будет просто оконное(консольное) приложение в котором будет использовать две первые dll. Будет действовать закон хочет использовать
сортировку DLL будь добр реализуй интерфейс в классе объекты которого ты хочешь отсортировать

Мне кажется так все проблемы снимаются по поводу незнания dll типа присылаемого ему значения (ну в нашем случае массива неизвестных объектов). жду критики Внимание! Говорит и показывает...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 01-12-2010 08:12 » 

tipabot, а зачем 2 dll? Вообще зачем dll?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
tipabot
Интересующийся

by
Offline Offline

« Ответ #13 : 01-12-2010 09:09 » 

Dimka такая задача вынести весь функционал в dll чтоб потом подрубать в других программах и использовать их функционал, такие же DLL надо создать на запись и чтение из файла, из базы и т.д.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 01-12-2010 12:21 » 

tipabot, тогда я всё равно не понял, зачем 2 dll. Ведь интерфейс нужен лишь для сортировки - разумно, когда это всё лежит в одной сборке.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
tipabot
Интересующийся

by
Offline Offline

« Ответ #15 : 01-12-2010 13:25 » 

Ну или в одной наверно так логичней будет. Спасибо за совет.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines