/ / C # Linq to XML Element.Remove Code Optimization - c #, xml, linq

C # Linq в XML Element.Remove оптимізацію коду - c #, xml, linq

Я деякий час використовую 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, і ви отримаєте бажаний результат. Я перевірив свій запит, і він працює саме так, як ви хочете