2010-03-29 3 views
0

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

IEnumerable<XElement> vm; 
if (!cacher2.TryGetValue(name,out vm)) { 
    vm = project.Descendants(XName.Get(name)); 
    cacher2.Add(name, vm); 
} 


XElement[] abdl = (vm.Where(a => a.Attribute(attribute).Value == ab)).ToArray(); 

cacher2 является Dictionary<string,IEnumerable<XElement>> ToArray так я могу оценить выражение в настоящее время. Я не думаю, что это вызывает какие-либо проблемы с реальной скоростью. Проблема в том, что сама сама. Я ищу в любом месте от 1k до 10k предметов.

+0

Вы действительно видите какие-либо хиты производительности, или вы обеспокоены тем, что может быть один, если ваш набор поиска станет слишком большим? –

+0

Я вижу огромный его с последней строкой кода. Верхние строки - это просто показать, что я кеширую как можно больше. Существует больше кода для кэширования результата abdl. Мне нужно знать, что мне нужно, чтобы преобразовать этот XDocument или какие специальные методы использовать, чтобы разрешить то, что мне нужно делать ... но быстрее. :-) – Dested

ответ

1

Нужно позвонить .ToArray? Я не понимаю, почему вы не можете просто перебирать словарный словарь (или позвонить .ToDictionary). Однако; вы профилировали? Если является узким местом здесь, вы можете попробовать откинувшись к XmlReader и рассматривая его как пожарный шланг:

 while (reader.Read()) 
     { 
      if (reader.NodeType == XmlNodeType.Element 
       && reader.GetAttribute("attribName") == attribValue) 
      { 
       /* do something interesting for fun and profit */ 
      } 
     } 

С вашего существующего кода, хотя, я бы очень хотелось, чтобы это сделать:

vm.Where(a => (string)a.Attribute(attribute) == ab) 

Разница в том, что, не вызывая .Value, он должен работать, даже если атрибут не установлен. Конечно, если вы запросите, что этот атрибут всегда установлен, исключение может быть приемлемым в этом случае.

+0

Знаете ли вы, какой бы быстрый способ конвертировать из моего vm = project.Descendants (XName.Get (name)); заявление в XmlReader? Я попробую это и посмотрю, есть ли какие-то изменения. Кстати, я профилировал, что одна строка кода является узким местом для моего приложения. Я понимаю переоценку моих потребностей, но пока это путь, который я принимаю. – Dested

+1

'in (reader.Read())' был бы сердцем этого. Вы можете использовать 'ReadSubtree', чтобы получить читателя-читателя для чтения узлов, поэтому, возможно, просто используйте' XElement.Load (reader.ReadSubtree()) ', чтобы получить нужные вам узлы? –

+0

Я использую someXElement.CreateReader(); для создания нового xmlreader каждый раз, когда мне нужно запустить этот «запрос». Вы порекомендовали я кэшировать читателя и как-то вернуть его к началу, когда закончите? Или я должен создавать их, когда они мне нужны? – Dested

Смежные вопросы