C# 将Except()与IEnumerable一起使用<;XElement>;解析XML文件时不起作用

C# 将Except()与IEnumerable一起使用<;XElement>;解析XML文件时不起作用,c#,xpath,ienumerable,xelement,except,C#,Xpath,Ienumerable,Xelement,Except,我在尝试过滤XML文件的内容时遇到了C#问题 我想根据XML条目列表中的条目是否与第二个XML条目列表中的条目匹配,从XML条目列表中删除条目,并将过滤后的列表作为新的条目列表返回,我可以遍历这些条目并处理它们 我正试图用.Except()函数来实现这一点,因为它似乎是专门为此而设计的。MSDN中给出的示例似乎表明,这正是函数的目的 然而,它不工作,我找不到一个优雅的解决方案。我知道,每次尝试对第二个列表中的某个项目执行操作时,我都可以手动迭代第二个列表,但这并不美观,而且代码很难阅读 下面是我

我在尝试过滤XML文件的内容时遇到了C#问题

我想根据XML条目列表中的条目是否与第二个XML条目列表中的条目匹配,从XML条目列表中删除条目,并将过滤后的列表作为新的条目列表返回,我可以遍历这些条目并处理它们

我正试图用
.Except()
函数来实现这一点,因为它似乎是专门为此而设计的。MSDN中给出的示例似乎表明,这正是函数的目的

然而,它不工作,我找不到一个优雅的解决方案。我知道,每次尝试对第二个列表中的某个项目执行操作时,我都可以手动迭代第二个列表,但这并不美观,而且代码很难阅读

下面是我的代码的一个简化示例,它不起作用

首先是一个示例XML文件:

<?xml version="1.0" encoding="utf-8"?>
<MyTest version="1.0">
  <Validation>
    <Manifest>

      <VerifyItems SinceVersion="1.5">
        <Item Type="File"      Uninstalled="True"  Location="%ProgramData%\MyData"  >MyFirstFile.dat</Item>
        <Item Type="File"      Uninstalled="True"  Location="%ProgramData%\MyData"  >MySecondFile.dat</Item>
        <Item Type="Folder"    Uninstalled="True"  Location="%ProgramData%\MyData"  >MyFirstFolder</Item>
        <Item Type="Folder"    Uninstalled="True"  Location="%ProgramData%\MyData"  >MySecondFolder</Item>
      </VerifyItems>

      <VerifyItems SinceVersion="2.1">
        <Item Type="File"      Uninstalled="True"  Location="%ProgramData%\MyData"  >aNewerFile.dat</Item>
        <Item Type="Folder"    Uninstalled="True"  Location="%ProgramData%\MyData"  >aNewerFolder</Item>
      </VerifyItems>

      <RemovedItems  SinceVersion="2.1">
        <Item Type="Folder"    Uninstalled="True"  Location="%ProgramData%\MyData"  >MyFirstFolder</Item>
        <Item Type="Folder"    Uninstalled="True"  Location="%ProgramData%\MyData"  >MySecondFolder</Item>
      </RemovedItems>

    </Manifest>
  </Validation>
</MyTest>

MyFirstFile.dat
MySecondFile.dat
我的第一个文件夹
MySecondFolder
aNewerFile.dat
自动文件夹
我的第一个文件夹
MySecondFolder
下面是一个我想使用但不起作用的C代码示例:

// Among other Using statements, I have these up at the top.
using System.Xml.Linq;
using System.Xml.XPath;

// Load the XML file into memory.
XElement XMLFileContents = XElement.Load("MyXMLFile");

// The following statement retrieves all "Verify" items for all versions,
// since the product version cited in the query is newer than everything
// in the file. Total of 6 items.
IEnumerable<XElement> PresentItemResults = XMLFileContents.XPathSelectElements("//VerifyItems[@SinceVersion<=2.20]/Item");

// The following statement retrieves all "Removed" items for all versions,
// total of 2 items. These items both match items already extant in the
// "Verify" list.
IEnumerable<XElement> RemovedItemResults = XMLFileContents.XPathSelectElements("//RemovedItems[@SinceVersion<=2.20]/Item");

// Attempt to create a third list which, in theory, should be only four
// items long, filtering out the two items in the "Removed" list from
// the six items in the "Verify" list. It looks like the "Except()" function
// should do what I want.
IEnumerable<XElement> FilteredItemResults = PresentItemResults.Except(RemovedItemResults);

// However it does not remove the items. The output from below
// is 6 2 6, not 6 2 4 like I'd hoped.
Console.WriteLine(PresentItemResults.Count().ToString());
Console.WriteLine(RemovedItemResults.Count().ToString());
Console.WriteLine(FilteredItemResults.Count().ToString());

// I want to put code here that works with the contents of FilteredItemResults.
// However I am not getting a filtered list.
//在其他使用语句中,我在顶部有这些语句。
使用System.Xml.Linq;
使用System.Xml.XPath;
//将XML文件加载到内存中。
XElement XMLFileContents=XElement.Load(“MyXMLFile”);
//以下语句检索所有版本的所有“验证”项,
//因为查询中引用的产品版本比所有版本都要新
//在文件中。共6项。
IEnumerable PresentItemResults=XMLFileContents.XPathSelectElements(“//VerifyItems[@SinceVersion
但我不关心父母和兄弟姐妹,我只希望根据每个项目的属性和值从另一个列表中筛选出一个列表

您应该能够调用需要
IEqualityComparer
的来告诉它这一点