你能改进这个linq-to-xml方法的性能吗?

时间:2011-03-19 09:20:16

标签: c# performance linq-to-xml

今天早上我真的需要去别的地方。所以,我决定在这里发布一个表现问题。

下面的代码可以工作,但它多次调用Load和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 个答案:

答案 0 :(得分:2)

您已经自己给出了答案 - 只需将LoadSave调用移到循环之外。我不清楚你自己在实施这个问题的地方......

您可以使查询稍微简单一些:

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);

如果属性引用本身为null,则使用从XAttributestring的转换返回null的事实。

您甚至不需要使用查询表达式:

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