| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Коллекция состоящая из коллекций классов. |
| Автор: thomas 20.7.2007, 22:06 | ||
| Приветствую всех. Собственно вопрос в названии темы.
Такое в принципе возможно? Или противоречит .NET ? |
| Автор: thomas 21.7.2007, 10:20 | ||||
Возможно это и так. Я вот только подумал, так сказать, поглубже, поширее. Ну создам я эту коллекцию коллекций, а ведь мне потом надо будет сохранить данные которые она содержит в таблицу БД. И что я тут буду делать? Ведь что получается: - класс содержит значения code, description и value; - коллекция этих классов определяет одну строку будущей таблицы, где description=название колонки(поля), а value=соответственно значение; - коллекция коллекций соответственно составляет всю таблицу. А там еще одни "грабли" нарисовались: это ID строки, которое в классе не прописывается, а по идее должно быть указано как свойство коллекции классов. И вот передомной встал разумный вопрос: а как мне доставать нужные мне данные из этой коллекции коллекций. Ну там с коллекцией классов более мение понятно. Есть свойство индекс, оно определяет класс в коллекции и далее свойство класса value.
так до этой коллекции еще нужно добраться из старшей коллекции. И тут я теряюсь, как невеста на смотринах. PS если это не выходит за рамки темы, то может обсудим. |
| Автор: mr.DUDA 21.7.2007, 10:30 |
| Ничего не понимаю. Почему класс - не строка таблицы а поле ? Зачем 2 коллекции, если достаточно одной (коллекции объектов-строк) ? Последний вопрос на засыпку - DataTable / DataRow смотрели ? |
| Автор: thomas 21.7.2007, 11:17 | ||||||
mr.DUDA,
Это я смотрел и в принцыпе люблю. Просто, в данной ситуации, меня попутал работодатель. Я тут программку мучаю для создания XML из xls. Я, как мне и привычно, работу выполнил используя DataSet и DataBase. Но так как входные данные поступают различного вида(ко-во и название колонок в таблицах), а исходящий XML должен содержать строго определенные элементы таблицу в DataBase приходиться создавать динамически при этом проверяется 23 чекбокса (должен этот элемент отображаться в исходящем XML или нет). Поэтому программа работает медленно. Ну данный товарищ и настоял на использовании классов. И тут и возникли вот такие "интересные" конструкции. Идти пришлось с конца, т.е. от XML элементов и их аттрибутов. Вот кусок XML который нужно заполнять их входящих в виде xls данных:
И тут получается класс описывает элемент Comp = <Comp code="9" value="Belliardstraat"/> Таких элементов может быть 23 ( они выведены в отдельную таблицу в БД -> code и description(улица, номер дома, страна, почтовый индекс и т.д. и т.п.)) Коллекция этих классов описывает адрес в целом. (адресов порядка 20-40 тысяч)
Идентификатором данного адреса будет аттрибут элемента Item --> midNum="10123453332523" Ну и соответственно коллекция коллекций будет содержать все адреса которые внесены в данный XML. И вот я вижу что такой подход не очень правильный. Да еще раз вернусь к таблице элементов адреса. Там дано 23 кода и то что этот код означает. В каждом отдельном XML комбинация этих кодов может быть различна. В данном примере их 4-ре ->9, 13, 15, 19. Потому как во входном xls были такие колонки. А в другом xls таблица другого содержания и коды будут 91, 15 ,16 или 7, 9, 12, 15, 16. И заказчик говорит что, кол-во кодов может со временем поменяться. Потому их и вывели в отдельную таблицу в БД. Если что-то измениться, то достаточно будет внести изменения в эту таблицу и программа продолжает работать. Про это я спрашивал http://forum.vingrad.ru/forum/topic-164263/anchor-entry1202507/0.html Ну это уже отступление от темы. |
| Автор: mr.DUDA 21.7.2007, 13:00 | ||
Вот пример как юзать XML с классами, может натолкнёт на какие-нибудь мысли:
Единственное, что нужен "корневой объект" (DocRoot в примере). |
| Автор: thomas 21.7.2007, 14:46 |
| mr.DUDA, Спасибо. Очень интересно. Думаю в дальнейшем мне это очень пригодиться. Но к данному случаю не очень подходит. Так как приведенный выше фрагмент XML является конечным продуктом(output), отправляемым программой для обработки на почту. А входным(input) является файл Excel с произвольной таблицей адресов, получаемый от клиента. Первый шаг программы это прочитать xls, поместить данные в таблицу ДатаСет и выдать список наименований колонок имеющейся таблицы.(помещается в комбобокс) Второй шаг создание таблицы в БД со стандартными названиями колонок и заполнение ее данными из таблицы ДатаСет, плюс добавить колонку с PreSortingCode. Третий шаг чтение данных из БД и запись их в XML. Все это я уже в принципе реализовал. Просто заказчику не понравилось что таблица в БД заполняется данными из ДатаСет построчно и слишком медленно. И ему подумалось что если вместо таблицы в ДатаСет использовать коллекцию классов будет быстрее. Вот я и начал "мутить" с классами. Хотя мне кажеться быстрее все равно не будет. Таблицу в БД иначе как командой INSERT INTO не заполнить. А она выполняется построчно. Или я не прав? И второе какая в принципе разница откуда брать значения для ввода в XML из таблицы ДатаСет(БД) или из коллекции классов. То и другое в памяти. Вроде простенькая программа, а столько подводных камней и течений. Вообще самый главный тормоз этой программы - это динамическое создание команды INSERT INTO с переопределением названий колонок ( каждый раз надо проверить состояние 23 чекбоксов) и построчное заполнение данными таблицы в БД. Лучше бы этого не делать, но нужно сохранить данные которые были отправлены. Если после контроля на почте придет файл с ошибками адресов, то редактировать эти ошибки проще и удобнее в таблице БД. ЗЫ не знаю есть ли смысл дальнейшего разговора о коллекции коллекций классов или тему можно закрывать. |
| Автор: Idsa 22.7.2007, 00:08 | ||||
Не уверен, что правильно понял задачу... но всё же:
Насколько я понял, на этом этапе используется 1 таблица. Тогда лучше использовать не DataSet, а DataTable.
Здесь можно только посоветовать создать один пакет команд (записать все insert'ы в одну строку, разделив их точкой с запятой). Вот этот этап можно неплохо оптимизировать. Как он у тебя реализован сейчас? |
| Автор: thomas 23.7.2007, 00:06 | ||
Привет. Готовая таблица адресов из БД помещается в таблицу ДС. Считываю построчно данные отуда и при помощи XmlTextWriter() записываю и сохраняю XML-файл Сейчас программа пишет файл на 32920 адресов за 27 сек. (WinXP SP2, CPU 1,4 Ггц) Размер файла 9,59Мб. По мне так нормально. А вот записать эти 32920 строк в БД из ДС нужно 42 минуты. |
| Автор: sTa1kEr 23.7.2007, 00:43 | ||
Подождите, а что мешает в данном случае создать insert'ы с готовым набором строк - это буде намного быстрее, чем на одну строку по запросу. Зачем читать в ДС? DataSet-ы - это в первую очередь пустая трата ресурсов на удобную выборку (или биндинг), в данном случае абсалютно не нужна. Почему, читая базу, сразу не писать в XML? И еще, может не совсем в тему, но все же попробуйте использовать Altova MapForce для генерации XML из БД. |
| Автор: thomas 23.7.2007, 00:59 | ||||||
sTa1kEr,
Если интересно вот код:
Вот такая маленькая процедурка. |