下午好集合構建一個IEnumerable,基於集合
我有一個非常有趣的時間,試圖說服「產量」關鍵字的方式,我能理解的功能,但遺憾的是我沒有太多的運氣。這裏的情景:
基於用戶的財產,我想查找一組RSS源地址和那些飼料的所有,不每個這些飼料顯示最近七次的文章。爲此,我試圖從每個Feed中構建最近五篇文章的集合,然後從這些文章中選取最近的七篇文章。 (非常沉悶)僞碼型過程進行類似:
- 中查找成員
- 獲取該成員的有關財產(一組名字)
- 查找的地址RSS源爲該組
- 對於集合中的每個地址,得到的五個最新的文章,並放置在另一個集合
- 採取從 隨後收集最近七次的文章,並顯示它們。
我做了一些研究,已經能夠生產以下:
public static class RSSHelper
{
public static IEnumerable<SyndicationItem> GetLatestArticlesFromFeeds(List<string> feedList, short articlesToTake)
{
foreach (string Feed in feedList)
{
yield return GetLatestArticlesFromFeed(Feed).OrderByDescending(o => o.PublishDate).Take(articlesToTake).First();
}
yield return null;
}
private static IEnumerable<SyndicationItem> GetLatestArticlesFromFeed(string feedURL)
{
// We're only accepting XML based feeds, so create an XML reader:
SyndicationItem Result = new SyndicationItem();
int SkipCount = 0;
for (int Curr = 1; Curr <= 5; Curr++)
{
try
{
XmlReader Reader = XmlReader.Create(feedURL);
SyndicationFeed Feed = SyndicationFeed.Load(Reader);
Reader.Close();
Result = Feed.Items.OrderByDescending(o => o.PublishDate).Skip(SkipCount).Take(1).Single();
SkipCount++;
}
catch (Exception ex)
{
// Do nothing, else the Yield will fail.
}
yield return Result;
}
}
}
什麼似乎發生的事情是,我得到五個結果(articlesToTake是7,而不是5),偶爾要麼整個SyndicationItem爲空,或者它的屬性爲空。我也確信這是一個解決這個問題的非常非常不好的方法,但是在這種情況下我找不到使用yield關鍵字的很多方向。
我確實找到了this question,但這並不能幫助我理解任何東西。
正在嘗試以這種方式達到目的嗎?還是我只需要咬緊牙關並使用幾個foreach循環?
「偶爾或者整個SyndicationItem爲空」那麼,你做'產出返回null;'......你期望發生什麼? – NPSF3000
@ NPSF3000它*應該是無法訪問的代碼,因爲FeedList中總是有一個字符串。當然,檢查會更合適,但是在工作時我會加強檢查。 – Ashilta
所以在feedlist中有一個字符串,並且一旦處理完它就會返回到下一個返回null的語句。這是非常可達的代碼。 – NPSF3000