0

我使用 Linq to XML 已经有一段时间了,但离它的高级用户还很远。每隔一段时间,我都会查看我的代码并说,“必须有一种更有效的方法来做到这一点”,所以我想看看 StackOverflow 的世界是否知道一种改进以下内容的方法代码。正在完成的是向该方法提供一个简单的方法,该方法List<string>具有要从 XML 文件中保存的系统记录中删除的软件列表。

var xe = (from el in mainForm.xeSystemData.Elements("System")
              where el.Element("Name").Value == systemName
              select el.Element("SoftwareList"));

    foreach (string sw in softwareToRemove)
    {
        foreach (var v in xe.Elements("Software"))
        {
            if (v.Value.ToString() == sw)
            {
                v.Remove();
            }
        }
    }

以下是供参考的 XML 片段:

<SoftwareList>
  <Software>IBM Client Access</Software>
  <Software>Adobe Acrobat Reader 10.1</Software>
</SoftwareList>

我一直在想的是,有一种更快的方法可以利用 Linq to XML 来删除选择性元素,而无需创建两个 foreach 循环。

4

2 回答 2

2

我可能会做这样的事情:

var toRemove = new HashSet<string>(sofwareToRemove);

foreach(var item in xe.Elements("Software")
                      .Where(e => toRemove.Contains(e.Value))
{
   item.Remove();
}

这不是特定于 Linq to XML,只是使用 HashSet 而不是列表,这将整体工作量从 O(n^2) 减少到 O(n)

于 2013-08-30T23:35:15.447 回答
1
var xe = (from el in mainForm.xeSystemData.Elements("System")
          where el.Element("Name").Value == systemName
          select el.Element("SoftwareList"));

xe.Descendants("Software").Where(x => softwareToRemove.Contains(x.Value)).Remove();

您不需要运行任何 foreach 循环,只需添加上面的 LINQ 查询,您就会得到想要的结果。我已经测试了我的查询,它完全符合您的要求

于 2013-09-05T09:41:42.097 回答