代码之家  ›  专栏  ›  技术社区  ›  Alan Le

组合两个联合源

  •  10
  • Alan Le  · 技术社区  · 16 年前

    什么是简单的组合方式 喂养 馈电2 ?我要的东西来自 馈电2 添加到 喂养 . 我也希望避免重复 喂养 当一个问题同时用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);
    
    6 回复  |  直到 9 年前
        1
  •  11
  •   Paolo    16 年前

    您可以使用LINQ来简化代码来连接两个列表(不要忘了将System.Linq放在您的using中,如果需要,还可以在项目中引用System.Core),这里有一个主函数来执行联合,并将它们打印到控制台(对读卡器进行适当的清理)。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.ServiceModel.Syndication;
    
    namespace FeedUnion
    {
        class Program
        {
            static void Main(string[] args)
            {
                Uri feedUri = new Uri("http://stackoverflow.com/feeds/tag/silverlight"); 
                SyndicationFeed feed;
                SyndicationFeed feed2;
                using(XmlReader reader = XmlReader.Create(feedUri.AbsoluteUri))
                {
                    feed= SyndicationFeed.Load(reader); 
                }
                Uri feed2Uri = new Uri("http://stackoverflow.com/feeds/tag/wpf"); 
                using (XmlReader reader2 = XmlReader.Create(feed2Uri.AbsoluteUri))
                {
                feed2 = SyndicationFeed.Load(reader2);
                }
                SyndicationFeed feed3 = new SyndicationFeed(feed.Items.Union(feed2.Items));
                StringBuilder builder = new StringBuilder();
                using (XmlWriter writer = XmlWriter.Create(builder))
                {
                    feed3.SaveAsRss20(writer);
                    System.Console.Write(builder.ToString());
                    System.Console.Read();
                }
            }
        }
    }
    
        2
  •  1
  •   Frater    16 年前

    嗯,一种可能是创建一个新的联合提要,它是第一个提要的克隆,然后简单地迭代第二个提要上的每个帖子,检查第一个提要是否存在,如果不存在则添加它。

    沿着这条线的东西:

    SyndicationFeed newFeed = feed.clone;
    foreach(SyndicationItem item in feed2.items)
    {
      if (!newFeed.contains(item))
        newFeed.items.Add(item);
    }
    

    也许能做到。看起来“items”是联合项目的一个简单的可枚举列表,所以没有理由不能简单地添加它们。

        3
  •  0
  •   Community CDub    8 年前

    如果它仅用于stackoverflow,则可以使用:
    https://stackoverflow.com/feeds/tag/silverlight%20wpf
    这个 把两个标签结合起来。

    对于更一般的解决方案,我不知道。您可能需要手动迭代两个提要的元素并将它们连接在一起。您可以比较<entry>的<id>元素,查看它们是否重复。

        4
  •  0
  •   rasx    13 年前

    我已经将今天接受的答案变成了一个单元测试,只是想稍微探讨一下:

        [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.");
        }
    
        5
  •  0
  •   Manjit    11 年前
            //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);
    
        6
  •  0
  •   Pherekles    9 年前

    这对我很有用:

    // 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