0

我有以下xml

<Books>
    <Book>
        <Name>Let Us C</Name>
        <Price>250</Price>
        <ID>234</ID>
    </Book>
    <Book>
        <Name>Da Vinci Code</Name>
        <Price>500</Price>
        <ID>38</ID>
    </Book>

    <Book>
        <Name>Data Structures through C++</Name>
        <Price>250</Price>
        <ID>234</ID>
    </Book>


</Books>

我需要删除所有具有给定 ID(比如 234)的书籍,并且 LINQ 查询应该将已删除书籍的 ID 和名称作为 keyValue 对返回给我。是否可以使用相同的 LINQ 查询来完成?

我写了以下内容来删除 ID 为 38 的书。但是我无法获得 ID 和名称,而无需再次对其进行迭代。

var idsToRemove  = new List<int>{{38}};
XDocument xmlDoc = XDocument.Load("sample.xml");

xmlDoc.Descendants("Book")
                .Where(
                    Book =>
                    (Book.Element("ID") != null
                    && idsToRemove.Contains(Convert.ToInt32((string) Book.Element("ID").Value)))).Select(Book => Book).Remove();

编辑1:

为给定书籍 ID 选择键值对的代码。

var result = xmlDoc.Descendants("Book")
                .Where(
                    Book =>
                    (Book.Element("ID") != null
                    && idsToRemove.Contains(Convert.ToInt32((string) Book.Element("ID").Value)))).Select(Book => new KeyValuePair<int,string>( Convert.ToInt32(Book.Element("ID").Value),(string)Book.Element("Name")));

如何将两者与单个 LINQ 查询合并

4

1 回答 1

1

为什么不保存查询结果并Remove在该变量上执行?

var booksToRemove =
    xmlDoc.Descendants("Book")
          .Where(Book =>
              (Book.Element("ID") != null && 
              idsToRemove.Contains(Convert.ToInt32((string)Book.Element("ID").Value))))
          .ToArray();

booksToRemove.Remove();

var removedBooks = booksToRemove.Select(x => new
                                        {
                                            ID = (string)x.Element("ID"), 
                                            Name = (string)x.Element("Name")
                                        }).ToArray();
于 2013-04-12T12:40:26.110 回答