![]() |
|
Модераторы: diadiavova, gambit |
![]()
|
|
| BugZZ |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.5.2008 Где: Germany Репутация: нет Всего: нет |
Привет, Эксперты!
Итак. Добрались руки до VS 2008 Sp1 и до парочки XML документов, которые надо прочитать Начну с задумки: Сделать тулзу которая читает n-е кол-во XML документов и из них всех вытаскивает только один определённый элемент и записывает его значение в DataGridView Что реализовано: - выбор неопребеделённого кол-ва файлов черех OpenFileDialog - чтение всех выбраных фалоф на предмет нужного эелемента - сохраниние содержания элемента в "таблицу" (ДатаГридВью) проблема: - после прочтение более чем однго файла, в DGV (DataGridView) появляюся одинаковые записи - что абсолютно нормально пояснение: - каждый xml файл - это результат онлайн воутинга к фотографиям. К каждому JPG был создан XML в котором написано с какого ИП какую оценку поставили. Чтоб небыло жульничество, в XML сохраняются ТОЛЬКО разные ИП - повторов нет. НО, с одного ИП было проголосовано за несколько фотографий - отсюда один ИП может быть записан сразу в нескольких xml-файлах. Отсюда и двойные, тройные ... n-e записи одного ИП в DGV после прочтения БОЛЕЕ ОДНОГО xml-файлов Цель: - Заставить XMLTextReader сохранять данные элемента только в том случае если запись НЕ присутвует в DGV моя логика, которая к сожалению не работает, точнее реализовать которую так и не получилось....: 1. Если DGv - пуст -> читаю первый xml-файл в DGv 2. Если DGV НЕ пуст -> проверяю, при добавлении новой записи, есть ли в DGV уже такая. НЕТ - добавляю. ДА - иду дальше... пример XML-файла:
в DGV должны сохранятся ТОЛЬКО ИП. Тобиш значение элемента <username> код, который добавляет все найденые username во всех выделенных файлах
Буду рад советам, подсказам ну или какой-либо другой инфе. скрин, после прочтения 8ми фалов Как видно из картинки, некоторые ИП записаны все 8 раз ..... |
||||
|
|||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Забей данные в промежуточную коллекцию, потом отфильтруй функцией Distinct с самописным компэарером.
В данном примере я показал следующее: Сначала по результату обработки файлов создаётся коллекция готовых строк для вставки в грид. Предполагается, что в коллекции есть столбец, под названием "ip"с типом данных Integer. Тут всё просто. Если есть IP к примеру такой 123.326.4.34, то мы вставляем в эту колонку число 123326004034. Таким образом в этой колонке у нас будет одинаковое число при одинаковых IP. Далее при вызове метода Distinct будет возвращена коллекция без повторов. Здесь весь секретв классе RowComparer. Функция Equals1 у него должна возвращать значение, указывающее равны ли объекты, а GetHashCode1 возвращать одинаковое значение для одинаковых объектов. Если правильно реализуешь логику сравнения, то код заполнения таблицы будет работать как надо. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| BugZZ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.5.2008 Где: Germany Репутация: нет Всего: нет |
Тоже удивлялся. Это дело рук какой-то "мудрёной" CMS....
Хммм а вот тут уже появятся другие проблемы 12.201.45.10 -> 122014510 122.0.145.10 -> 122014510 А вообще знакомый сказал, что у меня ошибка в стравениени.... Решением была бы функция которая возвращала тру\фалс если запись уже присутствует в датагрид |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
BugZZ, не знаю, возможно я непонятно объяснил, попытаюсь сформулировать иначе.
Для того, чтобы иметь возможность удалить повторяющиеся элементы списка, нужно точно сформулировать по каким критериям следует определять совпадение элементов. В дотнете для этого существует интерфейс IEqualityComparer(Of T). Реализовав его в класе ты обязан определить два метода: Equals - получает два объекта сравниваемого типа и выдаёт True в случае, если объекты следует считать равными(логику прописываешь сам). GetHashCode - этот метод возвращает для каждого объекта некоторое число таким образом, чтобы равным объектам соответствовало одно и то же число. Если такой класс будет реализован, то его экземпляр можно передать методу Distinct и он отфильтрует коллекцию по описанному в этом классе правилу сравнения. На счёт свойства у грида, позволяющего исключать повторяющиеся записи не в курсе, может и есть. Добавлено через 2 минуты и 13 секунд
Ну я ведь не так описал. Каждый сегмент айпишника должен состоять из трёх разрядов, если меньше - заполняй нулями. В моём примере ведь так. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| BugZZ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.5.2008 Где: Germany Репутация: нет Всего: нет |
Окей буду, пробовать. Просто после твоего поста, в очередной раз увидел что know-how у меня мало и многое - просто не знаю!
Извиняй, я не сразу обратил внимание. Как добъюсь результатов - отпишусь.... |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| BugZZ |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.5.2008 Где: Germany Репутация: нет Всего: нет |
итак, пошел по легкому пути и сначала обкатал вариант с функцией которая говорит тру - если такой ИП уже есть и ФАЛС - если таких еще не обнаруженно.
итак вот функция:
функцию я потестил. Все работает и делает то, что от нее требуется... После проверки функции долго смеялся ибо выяснилось что мой myXmlReader почему то вообще без моего ведома творит что хочет. итак. применяю фукцию.
запускаю тулзу и вижу что вместо ИП-адресов записаны даты-воутенга, хотя о них в коде НЕТ НИ СЛОВА! Вобщем, после проверок, пришел к вывроду что по каким-т непонятным причинам, XMLReader действует по след. принципу: 1 - читает документ 2 - Элемент и тебя зовут "username"? ДА! 2.1 Ты уже есть в списке (ДГВ) ? ДА 2.2 Беру след Элемент в файле (<date>) -----а все даты уникальны. Повторов нет! может конечно и не совсем так, но причина по которой ни с того ни с сяго берётся другой НИГДЕ НЕДЕКЛАРИРОВАННЫЕ элемент- мне не ясна...... Это сообщение отредактировал(а) BugZZ - 22.10.2009, 15:48 |
||||
|
|||||
| Pilger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 10.5.2008 Где: Германия Репутация: нет Всего: нет |
Попробуй myXmlReader.ReadElementString.Trim сначала в переменную поместить, а уже оттуда в функцию и в столбец. Проблема в том, что ReadElementString после прочтения сам перескакивает на сл. элемент, а т.к. ты его вызываешь 2 раза, то он соответственно сдвигается два раза. В функцию засовывается то что надо, а в столбец сл. элемент.
Да и в экономическом плане удобнее. Зачем вызывать myXmlReader.ReadElementString.Trim дважды, когда можно записать в переменную. Это сообщение отредактировал(а) Pilger - 22.10.2009, 16:50 -------------------- Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert. |
|||
|
||||
| BugZZ |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.5.2008 Где: Germany Репутация: нет Всего: нет |
Макс, ты как обычно не подкачал. Все заработало. Решение :
Макс, тебе плюсик! |
||||
|
|||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Ну если это лёгкий путь тада извиняйте. В таком случае гораздо проще было перед добавлением новой строки в грид просто в цикле обходить все существующие и проверять, есть ли уже строка с таким айпи.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Pilger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 10.5.2008 Где: Германия Репутация: нет Всего: нет |
В общем то он так и сделал^^
-------------------- Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Кстати, если бы он использовал лист, то вообще можно было без цикла обойтись...метод Find, передаёшь ему функцию(точнее лямбду) сравнивающую айпишники и сопсно всё. Но это не комильфо. Небольшое изменение условий потребует переписывания всего кода, а в моём случае переписать придётся только функции сравнения в компораторе.
Кстати тоже юбилей сегодня 2000+ в песочнице -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 8 Всего: 142 |
Кстати: на счёт интерфейса...вот тут описал более-менее универсальную реализацию.
http://forum.vingrad.ru/forum/topic-277734...ethashcode.html -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
![]()
|
| Правила форума VB .NET | |
|
|
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB .NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |