2011-03-19 5 views
2

Мне действительно нужно быть где-то еще этим утром. Итак, я решил вместо этого задать вопрос о производительности.Можете ли вы улучшить производительность этого метода linq-to-xml?

Приведенный ниже код работает, но он вызывает метод Load and Save несколько раз. Это кажется далеким от эффективности. Пожалуйста, кто-нибудь может предоставить код до тех пор, пока строки загрузки и сохранения не будут выходить за пределы цикла. Я хочу вызвать загрузку и сохранить только один раз.

Благодарности братва :)

public void RemoveNodes(IList<String> removeItems) 

    { 

     foreach (String removeItem in removeItems) 

     { 

      XDocument document = XDocument.Load(fullFilePath); 

      var results = from item in document.Descendants(elementName) 

          let attr = item.Attribute(attributeName) 

          where attr != null && attr.Value == removeItem.ToString() 

          select item; 

      results.ToList().ForEach(item => item.Remove()); 

      document.Save(fullFilePath); 

     } 

    } 

ответ

2

Вы уже дали ответ сами - просто переместить Load и Save звонки за пределы контура. Это не для меня ясно, где вы были проблемы, реализующих это сам ...

Вы можете сделать запрос немного проще, хотя тоже:

XDocument document = XDocument.Load(fullFilePath); 
foreach (String removeItem in removeItems) 
{ 
    var results = from item in document.Descendants(elementName) 
        where (string) item.Attribute(attributeName) == removeItem 
        select item; 
    results.ToList().ForEach(item => item.Remove()); 
} 
document.Save(fullFilePath); 

Это использует тот факт, что переход от XAttribute к string возвращает Null если сама ссылка атрибута равна нулю.

Вам не нужно даже использовать выражение запроса:

var results = document.Descendants(elementName) 
      .Where(item => (string) item.Attribute(attributeName) == removeItem); 
+0

Я стараюсь не делать себе оправдание. Наверное, я не видел дерева для деревьев. Я бы выпил свое предписанное лекарство, когда передумал проблему. Стоит публиковать не только из-за повышения производительности, но и для упрощения, которого я, вероятно, не заметил бы - спасибо Jon – CarneyCode

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