2016-04-19 3 views
0

У меня есть RSS-канал, который я в настоящее время показываю 2 элемента, то, что я хочу, каждый раз, когда страница перезагружается, отображаются разные 2 элемента. Код, который у меня есть, -Выберите 2 случайных элемента из RSS-канала

//BBC UK 
string RssFeedUrl = "http://feeds.bbci.co.uk/news/uk/rss.xml?edition=uk"; 


List<Feeds> feeds = new List<Feeds>(); 
try 
{ 
    XDocument xDoc = new XDocument(); 
    xDoc = XDocument.Load(RssFeedUrl); 

    var items = (from x in xDoc.Descendants("item").Take(2) 
    select new 
    { 
     title = x.Element("title").Value, 
     link = x.Element("link").Value, 
     pubDate = x.Element("pubDate").Value, 
     description = x.Element("description").Value 
    }); 

    foreach (var i in items) 
    { 
     Feeds f = new Feeds 
     { 
      Title = i.title, 
      Link = i.link, 
      PublishDate = i.pubDate, 
      Description = i.description 
     }; 

     feeds.Add(f);   
    } 

Как изменить это, чтобы выбрать 2 случайных элемента каждый раз, когда страница перезагружается.

ответ

1

Вы можете использовать Random класс для генерации двух случайных чисел и взять эти два элементы из коллекции.

int[] randints = new int[2]; 
    Random rnd = new Random(); 
    randints[0] = rnd.Next(0, xDoc.Descendants("item").Count()); // creates first random number 


    do 
    { 
     randints[1] = rnd.Next(0, xDoc.Descendants("item").Count()); // creates second random number 
    }while (randints[1] == randints[0]); // make sure that you don't have duplicates. 


var items = xDoc.Descendants("item") 
    .Skip(randints[0]-1) 
    .Take(1) 
    .Concat(xDoc.Descendants("item") 
       .Skip(randints[1]-1) 
       .Take(1)) 
    .Select(x=> new 
     { 
      title = x.Element("title").Value, 
      link = x.Element("link").Value, 
      pubDate = x.Element("pubDate").Value, 
      description = x.Element("description").Value 
     }); 

foreach (var i in items) 
{ 
    Feeds f = new Feeds 
    { 
     Title = i.title, 
     Link = i.link, 
     PublishDate = i.pubDate, 
     Description = i.description 
    }; 

    feeds.Add(f);   
} 
+0

Благодарим вас за это - отлично работает – KlydeMonroe

+0

Отлично, я рад, что это вам помогло. –

0

Я бы лучше кэшировать эти значения в течение некоторого времени вместо запроса каждый раз, но если производительность не важна здесь одно решение

XDocument xDoc = XDocument.Load(RssFeedUrl); 
var rnd = new Random(); 
var twoRand = xDoc.Descendants("item") 
       .OrderBy(e => rnd.Next()).Take(2).Select(...) 
       .ToList(); 
Смежные вопросы