Я деякий час використовую Linq для 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 до XML для видалення вибіркових елементів, не створюючи двох циклів foreach.
Відповіді:
2 для відповіді № 1Я, напевно, зроблю так:
var toRemove = new HashSet<string>(sofwareToRemove);
foreach(var item in xe.Elements("Software")
.Where(e => toRemove.Contains(e.Value))
{
item.Remove();
}
Це не характерно для Linq до XML, однак просто використання HashSet замість списку, що зменшує загальне зусилля з O (n ^ 2) до O (n)
1 для відповіді № 2
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, і ви отримаєте бажаний результат. Я перевірив свій запит, і він працює саме так, як ви хочете