powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ XML, быстрый поиск элемента по имени и атрибуту
2 сообщений из 2, страница 1 из 1
LINQ XML, быстрый поиск элемента по имени и атрибуту
    #36061507
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здравствуйте
заполняю дерево, перед добавлением листа надо найти для него родительский узел (по имени и значению атрибута), если такой узел не найден, то его тоже надо создать. важна скорость, что посоветуете?

пробовал такие варианты (XElement skillNode - искомый/добавляемый родительский узел, XElement treeRoot - корень дерева):

1. через xpath, способ самый красивый, но очень тормозной
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            xpath = "skill[@Id='" + sklId + "']";
            skillNode = treeRoot.XPathSelectElement(xpath);
            if (skillNode == null) { // узел не найден - добавляем
                skillNode = new XElement("skill",
                    new XAttribute("Id", sklId),
                    new XAttribute("Name", skd.Name));
                treeRoot.Add(skillNode);                
            }
           
            skillNode.Add(... )  // добавляем лист

2. через лямбду, быстрее в два раза, но приходится обрабатывать исключение и, что главное, все равно недостаточно быстрый:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            try {
                
                skillNode = treeRoot.Elements("skill").Single(skl => skl.Attribute("Id").Value == sklId);
            }
            catch { // не нашли - добавляем
                skillNode = new XElement("skill",
                    new XAttribute("Id", sklId),
                    new XAttribute("Name", skd.Name));
                treeRoot.Add(skillNode);                
            }

            skillNode.Add(... )  // добавляем лист

3. через селект, скорость как у первого способа, так еще и выглядит громоздко

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
            var els =
                from tt in treeRoot.Elements("skills")
                where tt.Attribute("Id").Value == sklId
                select tt;

            if (els.Count() > 0)
                skillNode = els.First(); // если нашли
            else { // если не нашли 
                skillNode = new XElement("skill",
                    new XAttribute("Id", sklId),
                    new XAttribute("Name", skd.Name));
                treeRoot.Add(skillNode);
            };

            skillNode.Add(... )  // добавляем лист
...
Рейтинг: 0 / 0
LINQ XML, быстрый поиск элемента по имени и атрибуту
    #36062131
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4. ручной перебор, еще немного быстрее чем вариант №2. но недостаточно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
            IEnumerable<XElement> skills = treeRoot.Elements("skill");
            skillNode = null;
                                    
            foreach (XElement skill in skills) {
                if (skill.Attribute("Id").Value == sklId) {
                    skillNode = skill;
                    break;
                }
            };


            if (skillNode == null) { // добавляем узел
                skillNode = new XElement("skill",
                    new XAttribute("Id", sklId),
                    new XAttribute("Name", skd.Name));
                treeRoot.Add(skillNode); 
            }

            skillNode.Add (... )  // добавляем лист
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ XML, быстрый поиск элемента по имени и атрибуту
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]