从XDocument中删除重复条目
本文关键字:删除 XDocument | 更新日期: 2023-09-27 18:02:30
我有几行像这样的代码:
XDocument rssDocDistinct = new XDocument(new XElement("rss",
new XElement("channel",
from node in rssDoc.Element("rss").Element("channel").Descendants("item")
select node)));
谁能帮我弄清楚如何在rssDoc中只获得不同的"项目"?我不想要任何副本。
谢谢你的帮助。
编辑:<rss version="2.0">
<channel>
<title></title>
<link></link>
<description></description>
<copyright></copyright>
<ttl></ttl>
<item>
<title></title>
<description></description>
<link></link>
<pubDate></pubDate>
</item>
<item>
<title></title>
<description> </description>
<link></link>
<pubDate></pubDate>
</item>
</channel>
</rss>
rssDocDistinct应该是这样的,没有重复的item元素(具有相同标题、链接、描述、pubDate的item只会出现一次)
<item>
<title></title>
<description></description>
<link></link>
<pubDate></pubDate>
</item>
<item>
<title></title>
<description> </description>
<link></link>
<pubDate></pubDate>
</item>
编辑:谢谢你的帮助,我得到了它通过弄清楚如何使一个IEqualityComparer polishchuc建议。
public class ItemComparer : IEqualityComparer<XElement>
{
#region IEqualityComparer<XElement> Members
public bool Equals(XElement x, XElement y)
{
return (string)x.Element("title") == (string)y.Element("title")
&& (string)x.Element("description") == (string)y.Element("description")
&& (string)x.Element("link") == (string)y.Element("link")
&& (string)x.Element("pubDate") == (string)y.Element("pubDate");
}
public int GetHashCode(XElement obj)
{
return ((string)obj.Element("title")).GetHashCode()
+ ((string)obj.Element("description")).GetHashCode()
+ ((string)obj.Element("link")).GetHashCode()
+ ((string)obj.Element("pubDate")).GetHashCode();
}
#endregion
}
查看Enumerable.Distinct
扩展方法。实现您自己的IEqualityComparer<XElement>
或(最好)继承EqualityComparer<T>
类,根据您的需要使用自己的不同逻辑。使用它,例如:
var comparer = new YourXElementComparer();
XDocument rssDocDistinct = new XDocument(new XElement("rss",
new XElement("channel",
from node in rssDoc.Element("rss").Element("channel").Descendants("item")
.Distinct(comparer)
select node)));