C# 合并两个SyndicationFeed
将提要和提要2结合起来的简单方法是什么?我希望将feed2中的项目添加到feed。另外,我希望避免重复,因为当一个问题同时使用WPF和Silverlight标记时,提要可能已经有了条目C# 合并两个SyndicationFeed,c#,linq,.net-3.5,C#,Linq,.net 3.5,将提要和提要2结合起来的简单方法是什么?我希望将feed2中的项目添加到feed。另外,我希望避免重复,因为当一个问题同时使用WPF和Silverlight标记时,提要可能已经有了条目 Uri feedUri = new Uri("http://stackoverflow.com/feeds/tag/silverlight"); XmlReader reader = XmlReader.Create(feedUri.AbsoluteUri); SyndicationFeed feed = Syn
Uri feedUri = new Uri("http://stackoverflow.com/feeds/tag/silverlight");
XmlReader reader = XmlReader.Create(feedUri.AbsoluteUri);
SyndicationFeed feed = SyndicationFeed.Load(reader);
Uri feed2Uri = new Uri("http://stackoverflow.com/feeds/tag/wpf");
XmlReader reader2 = XmlReader.Create(feed2Uri.AbsoluteUri);
SyndicationFeed feed2 = SyndicationFeed.Load(reader2);
如果它仅用于stackoverflow,您可以使用此:
此将合并两个标记
对于更一般的解决方案,我不知道。您可能需要手动迭代两个提要的元素并将它们连接在一起。您可以比较s的元素,看看它们是否重复。好吧,一种可能是创建一个新的联合提要,它是第一个提要的克隆,然后简单地在第二个提要上遍历每个帖子,检查第一个是否存在,如果不存在,则添加它 大致如下:
SyndicationFeed newFeed = feed.clone;
foreach(SyndicationItem item in feed2.items)
{
if (!newFeed.contains(item))
newFeed.items.Add(item);
}
也许能做到。看起来“items”是一个简单的可枚举的联合项目列表,因此没有理由不能简单地添加它们。您可以使用LINQ简化代码,将两个列表连接起来(不要忘记在您的使用中放置System.LINQ,如果需要,在您的项目中放置reference System.Core)。下面是一个Main,它执行联合并将它们打印到控制台(正确清理读卡器)
我将今天接受的答案转化为单元测试,只是为了稍微探讨一下:
[TestMethod]
public void ShouldCombineRssFeeds()
{
//reference: http://stackoverflow.com/questions/79197/combining-two-syndicationfeeds
SyndicationFeed feed;
SyndicationFeed feed2;
var feedUri = new Uri("http://stackoverflow.com/feeds/tag/silverlight");
using(var reader = XmlReader.Create(feedUri.AbsoluteUri))
{
feed = SyndicationFeed.Load(reader);
}
Assert.IsTrue(feed.Items.Count() > 0, "The expected feed items are not here.");
var feed2Uri = new Uri("http://stackoverflow.com/feeds/tag/wpf");
using(var reader2 = XmlReader.Create(feed2Uri.AbsoluteUri))
{
feed2 = SyndicationFeed.Load(reader2);
}
Assert.IsTrue(feed2.Items.Count() > 0, "The expected feed items are not here.");
var feedsCombined = new SyndicationFeed(feed.Items.Union(feed2.Items));
Assert.IsTrue(
feedsCombined.Items.Count() == feed.Items.Count() + feed2.Items.Count(),
"The expected number of combined feed items are not here.");
var builder = new StringBuilder();
using(var writer = XmlWriter.Create(builder))
{
feedsCombined.SaveAsRss20(writer);
writer.Flush();
writer.Close();
}
var xmlString = builder.ToString();
Assert.IsTrue(new Func<bool>(
() =>
{
var test = false;
var xDoc = XDocument.Parse(xmlString);
var count = xDoc.Root.Element("channel").Elements("item").Count();
test = (count == feedsCombined.Items.Count());
return test;
}
).Invoke(), "The expected number of RSS items are not here.");
}
[TestMethod]
public void shouldCombinersFeeds()
{
//参考:http://stackoverflow.com/questions/79197/combining-two-syndicationfeeds
联合饲料;
联合饲料饲料2;
var feedUri=新Uri(“http://stackoverflow.com/feeds/tag/silverlight");
使用(var reader=XmlReader.Create(feedUri.AbsoluteUri))
{
feed=SyndicationFeed.Load(读卡器);
}
Assert.IsTrue(feed.Items.Count()>0,“预期的提要项不在这里”);
var feed2Uri=新Uri(“http://stackoverflow.com/feeds/tag/wpf");
使用(var reader2=XmlReader.Create(feed2Uri.AbsoluteUri))
{
feed2=SyndicationFeed.Load(reader2);
}
Assert.IsTrue(feed2.Items.Count()>0,“预期的提要项不在这里”);
var feedsCombined=newsyndicationfeed(feed.Items.Union(feed2.Items));
阿塞特·伊斯特鲁(
feedsCombined.Items.Count()==feed.Items.Count()+feed2.Items.Count(),
“预期的组合饲料项目数量不在此处。”);
var builder=新的StringBuilder();
使用(var writer=XmlWriter.Create(builder))
{
feedsCombined.SaveAsRss20(编写器);
writer.Flush();
writer.Close();
}
var xmlString=builder.ToString();
Assert.IsTrue(新函数)(
() =>
{
var检验=假;
var xDoc=XDocument.Parse(xmlString);
var count=xDoc.Root.Element(“通道”).Elements(“项目”).count();
test=(count==feedsCombined.Items.count());
回归试验;
}
).Invoke(),“此处不存在预期数量的RSS项。”);
}
这对我来说很好:
// create temporary List of SyndicationItem's
List<SyndicationItem> tempItems = new List<SyndicationItem>();
// add all feed items to the list
tempItems.AddRange(feed.Items);
tempItems.AddRange(feed2.Items);
// remove duplicates with Linq 'Distinct()'-method depending on yourattributes
// add list without duplicates to 'feed2'
feed2.Items = tempItems
//创建SyndicationItem的临时列表
List tempItems=新列表();
//将所有提要项添加到列表中
tempItems.AddRange(feed.Items);
tempItems.AddRange(feed2.Items);
//使用Linq“Distinct()”-方法删除重复项,具体取决于属性
//将不带重复项的列表添加到“feed2”
feed2.Items=tempItems
我不认为一个简单的Contains()将这样做。他可能需要比较条目IDSRS项元素建议使用guid元素,但不是必需的。很可能需要通过首先比较guid来确定组合时是否包含。如果guid不存在,请比较链接元素。可能希望与标题进行比较以确保安全。我认为它将执行N代替OR。我想我需要合并提要。我刚刚检查过,它是一个OR根据这篇文章,它正在执行and。我想我需要等待union功能,然后才能使用RESTFUL标记uri。与此同时,我需要自己迭代并手动执行。LINQ和union…这是个天才。我希望不要迭代t通过feed,这符合要求。很高兴你仍然发现了它的用途:)
//Executed and Tested :)
using (XmlReader reader = XmlReader.Create(strFeed))
{
rssData = SyndicationFeed.Load(reader);
model.BlogFeed = rssData; ;
}
using (XmlReader reader = XmlReader.Create(strFeed1))
{
rssData1 = SyndicationFeed.Load(reader);
model.BlogFeed = rssData1;
}
SyndicationFeed feed3 = new SyndicationFeed(rssData.Items.Union(rssData1.Items));
model.BlogFeed = feed3;
return View(model);
// create temporary List of SyndicationItem's
List<SyndicationItem> tempItems = new List<SyndicationItem>();
// add all feed items to the list
tempItems.AddRange(feed.Items);
tempItems.AddRange(feed2.Items);
// remove duplicates with Linq 'Distinct()'-method depending on yourattributes
// add list without duplicates to 'feed2'
feed2.Items = tempItems