今天早上我真的需要去别的地方。所以,我决定在这里发布一个表现问题。
下面的代码可以工作,但它多次调用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);
}
}
答案 0 :(得分: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);
如果属性引用本身为null,则使用从XAttribute
到string
的转换返回null的事实。
您甚至不需要使用查询表达式:
var results = document.Descendants(elementName)
.Where(item => (string) item.Attribute(attributeName) == removeItem);