C# 阅读多个RSS源

C# 阅读多个RSS源,c#,silverlight,linq,windows-phone-7,C#,Silverlight,Linq,Windows Phone 7,我目前正在尝试在WindowsPhone7上创建一个小的RSS阅读器应用程序 到目前为止,我能够在不同的全景图上显示单个提要,而且效果很好 然而,在我的主页上,我想显示来自多个RSS源的最新新闻 例如,我在不同的页面上有feed1和feed2,我想在我的主页上显示来自feed1和feed2(或更多)的最新新闻的标题 这是我一直在使用的代码 已加载主页面\u: WebClient wc = new WebClient(); wc.DownloadStringAsync(new Uri("feed-

我目前正在尝试在WindowsPhone7上创建一个小的RSS阅读器应用程序

到目前为止,我能够在不同的全景图上显示单个提要,而且效果很好

然而,在我的主页上,我想显示来自多个RSS源的最新新闻

例如,我在不同的页面上有feed1和feed2,我想在我的主页上显示来自feed1和feed2(或更多)的最新新闻的标题

这是我一直在使用的代码

已加载主页面\u:

WebClient wc = new WebClient();
wc.DownloadStringAsync(new Uri("feed-goes-here"));
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
然后:

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {

            if (e.Error != null) return;

            XElement xmlItems = XElement.Parse(e.Result);

            listBox1.ItemsSource = from x in xmlItems.Descendants("item")
                                   where x.Element("enclosure") != null && x.Element("description") != null
                                   select new RSSitem 
                                   {
                                       Description = x.Element("description").Value.Substring(0,100)+"...", 
                                       Title = x.Element("title").Value,
                                       ImageSource = x.Element("enclosure").FirstAttribute.Value 
                                   };

        }
我已经测试了很多方法来解决我的问题,但仍然找不到答案

所以我的问题是:如何在列表框中显示来自同一页面上两个不同提要的最新新闻?
感谢您的帮助和宝贵的时间。

首先,我建议在RSSItem中添加一个日期属性:

public class RSSItem
{
    public DateTime Date { get; set; }
    public string Description { get; set; }
    public string Title { get; set; }
    public string ImageSource { get; set; }
}
这样,当您下载两个RSS源时,您可以将它们编织在一起并按日期排序:

private IEnumerable<RSSItem> Weave(List<RSSItem> feed1, List<RSSItem> feed2)
{
    return feed1.Concat(feed2)
        .OrderByDescending(i => i.Date)
        .Take(10); // Grab the ten most recent entries
}
private IEnumerable Weave(列表feed1,列表feed2)
{
返回馈线1.Concat(馈线2)
.OrderByDescending(i=>i.Date)
.Take(10);//抓取最近的十个条目
}
用法:

using System.Linq; // Don't forget to add using statement for System.Linq

public class RssReader
{
    private List<IEnumerable<RSSItem>> _feeds = new List<IEnumerable<RSSItem>>();

    public void Download()
    {
        WebClient wc = new WebClient();
        wc.DownloadStringCompleted += this.FeedDownloaded;
        wc.DownloadStringAsync(new Uri("feed-goes-here"));
    }

    private void FeedDownloaded(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null) return;

        var xml = XElement.Parse(e.Result);
        var feed = from x in xml.Descendants("item")
                   where x.Element("enclosure") != null && x.Element("description") != null
                   select new RSSItem()
                   {
                       Date = DateTime.Parse(x.Element("date").Value),
                       Title = x.Element("title").Value,
                       ImageSource = x.Element("enclosure").FirstAttribute.Value
                   };

        _feeds.Add(feed);

        if (_feeds.Count == 2)
        {
            var result = this.Weave(_feeds[0], _feeds[1]);

            // Assign result to the list box's ItemSource
            // Or better, use data binding.
        }
    }

    /// <summary>
    /// Combines the two feeds, sorts them by date, and returns the ten most recent entries.
    /// </summary>
    private IEnumerable<RSSItem> Weave(IEnumerable<RSSItem> feed1, IEnumerable<RSSItem> feed2)
    {
        return feed1.Concat(feed2)
            .OrderByDescending(i => i.Date)
            .Take(10);
    }
}
使用System.Linq;//不要忘记为System.Linq添加using语句
公共类RssReader
{
私有列表_feeds=新列表();
公开下载
{
WebClient wc=新的WebClient();
wc.DownloadStringCompleted+=this.feeddownloads;
DownloadStringAsync(新Uri(“feed在这里”);
}
私有void FeedDownloaded(对象发送方,DownloadeStringCompletedEventArgs e)
{
if(e.Error!=null)返回;
var xml=XElement.Parse(e.Result);
var feed=来自xml.subjects(“项”)中的x
其中x.Element(“enclosure”)!=null&&x.Element(“description”)!=null
选择新RSSItem()
{
Date=DateTime.Parse(x.Element(“Date”).Value),
Title=x.元素(“Title”).值,
ImageSource=x.Element(“附件”).FirstAttribute.Value
};
_feed.Add(feed);
如果(_feeds.Count==2)
{
var result=this.Weave(_feeds[0],_feeds[1]);
//将结果分配给列表框的ItemSource
//或者更好地使用数据绑定。
}
}
/// 
///合并两个提要,按日期对它们进行排序,并返回最近的十个条目。
/// 
私有IEnumerable Weave(IEnumerable feed1,IEnumerable feed2)
{
返回馈线1.Concat(馈线2)
.OrderByDescending(i=>i.Date)
.采取(10);
}
}