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