![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 6 Всего: 65 |
Приветствую всех.
Собственно вопрос в названии темы.
Такое в принципе возможно? Или противоречит .NET ? -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Если перевести на "русский", получим: List<List<MyClass>> myBigCollection = new List<List<MyClass>>(). Так? List<MyClass> полноправный тип, значит мы можем делать с ним все, что угодно (в том числе и создавать коллекцию таких типов). Это сообщение отредактировал(а) Idsa - 20.7.2007, 22:23 |
|||
|
||||
| thomas |
|
||||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 6 Всего: 65 |
Возможно это и так. Я вот только подумал, так сказать, поглубже, поширее. Ну создам я эту коллекцию коллекций, а ведь мне потом надо будет сохранить данные которые она содержит в таблицу БД. И что я тут буду делать? Ведь что получается: - класс содержит значения code, description и value; - коллекция этих классов определяет одну строку будущей таблицы, где description=название колонки(поля), а value=соответственно значение; - коллекция коллекций соответственно составляет всю таблицу. А там еще одни "грабли" нарисовались: это ID строки, которое в классе не прописывается, а по идее должно быть указано как свойство коллекции классов. И вот передомной встал разумный вопрос: а как мне доставать нужные мне данные из этой коллекции коллекций. Ну там с коллекцией классов более мение понятно. Есть свойство индекс, оно определяет класс в коллекции и далее свойство класса value.
так до этой коллекции еще нужно добраться из старшей коллекции. И тут я теряюсь, как невеста на смотринах. PS если это не выходит за рамки темы, то может обсудим. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
||||
|
|||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Ничего не понимаю. Почему класс - не строка таблицы а поле ? Зачем 2 коллекции, если достаточно одной (коллекции объектов-строк) ? Последний вопрос на засыпку - DataTable / DataRow смотрели ?
-------------------- ![]() |
|||
|
||||
| thomas |
|
||||||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 6 Всего: 65 |
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. И заказчик говорит что, кол-во кодов может со временем поменяться. Потому их и вывели в отдельную таблицу в БД. Если что-то измениться, то достаточно будет внести изменения в эту таблицу и программа продолжает работать. Про это я спрашивал тут. Ну это уже отступление от темы. Это сообщение отредактировал(а) thomas - 21.7.2007, 11:42 -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
||||||
|
|||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Вот пример как юзать XML с классами, может натолкнёт на какие-нибудь мысли:
Единственное, что нужен "корневой объект" (DocRoot в примере). -------------------- ![]() |
|||
|
||||
| thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 6 Всего: 65 |
mr.DUDA,
Спасибо. Очень интересно. Думаю в дальнейшем мне это очень пригодиться. Но к данному случаю не очень подходит. Так как приведенный выше фрагмент XML является конечным продуктом(output), отправляемым программой для обработки на почту. А входным(input) является файл Excel с произвольной таблицей адресов, получаемый от клиента. Первый шаг программы это прочитать xls, поместить данные в таблицу ДатаСет и выдать список наименований колонок имеющейся таблицы.(помещается в комбобокс) Второй шаг создание таблицы в БД со стандартными названиями колонок и заполнение ее данными из таблицы ДатаСет, плюс добавить колонку с PreSortingCode. Третий шаг чтение данных из БД и запись их в XML. Все это я уже в принципе реализовал. Просто заказчику не понравилось что таблица в БД заполняется данными из ДатаСет построчно и слишком медленно. И ему подумалось что если вместо таблицы в ДатаСет использовать коллекцию классов будет быстрее. Вот я и начал "мутить" с классами. Хотя мне кажеться быстрее все равно не будет. Таблицу в БД иначе как командой INSERT INTO не заполнить. А она выполняется построчно. Или я не прав? И второе какая в принципе разница откуда брать значения для ввода в XML из таблицы ДатаСет(БД) или из коллекции классов. То и другое в памяти. Вроде простенькая программа, а столько подводных камней и течений. Вообще самый главный тормоз этой программы - это динамическое создание команды INSERT INTO с переопределением названий колонок ( каждый раз надо проверить состояние 23 чекбоксов) и построчное заполнение данными таблицы в БД. Лучше бы этого не делать, но нужно сохранить данные которые были отправлены. Если после контроля на почте придет файл с ошибками адресов, то редактировать эти ошибки проще и удобнее в таблице БД. ЗЫ не знаю есть ли смысл дальнейшего разговора о коллекции коллекций классов или тему можно закрывать. Это сообщение отредактировал(а) thomas - 21.7.2007, 14:47 -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
| Idsa |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Не уверен, что правильно понял задачу... но всё же:
Насколько я понял, на этом этапе используется 1 таблица. Тогда лучше использовать не DataSet, а DataTable.
Здесь можно только посоветовать создать один пакет команд (записать все insert'ы в одну строку, разделив их точкой с запятой). Вот этот этап можно неплохо оптимизировать. Как он у тебя реализован сейчас? |
||||
|
|||||
| thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 6 Всего: 65 |
Привет. Готовая таблица адресов из БД помещается в таблицу ДС. Считываю построчно данные отуда и при помощи XmlTextWriter() записываю и сохраняю XML-файл Сейчас программа пишет файл на 32920 адресов за 27 сек. (WinXP SP2, CPU 1,4 Ггц) Размер файла 9,59Мб. По мне так нормально. А вот записать эти 32920 строк в БД из ДС нужно 42 минуты. Это сообщение отредактировал(а) thomas - 23.7.2007, 00:08 -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: нет Всего: 146 |
Подождите, а что мешает в данном случае создать insert'ы с готовым набором строк - это буде намного быстрее, чем на одну строку по запросу. Зачем читать в ДС? DataSet-ы - это в первую очередь пустая трата ресурсов на удобную выборку (или биндинг), в данном случае абсалютно не нужна. Почему, читая базу, сразу не писать в XML? И еще, может не совсем в тему, но все же попробуйте использовать Altova MapForce для генерации XML из БД. |
|||
|
||||
| thomas |
|
||||||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 6 Всего: 65 |
sTa1kEr,
Если интересно вот код:
Вот такая маленькая процедурка. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
||||||
|
|||||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |