Можете ли вы улучшить производительность этого метода linq-to-xml? - PullRequest
2 голосов
/ 19 марта 2011

Мне действительно нужно быть где-то еще этим утром. Поэтому я решил опубликовать здесь вопрос о производительности.

Приведенный ниже код работает, но несколько раз вызывает метод 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);

        }

    }

1 Ответ

2 голосов
/ 19 марта 2011

Вы уже дали ответ сами - просто переместите вызовы 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 возвращает ноль, если сама ссылка на атрибут равна нулю.

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

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