Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并两个SyndicationFeed_C#_Linq_.net 3.5 - Fatal编程技术网

C# 合并两个SyndicationFeed

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

提要提要2结合起来的简单方法是什么?我希望将feed2中的项目添加到feed。另外,我希望避免重复,因为当一个问题同时使用WPF和Silverlight标记时,提要可能已经有了条目

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