Генерация случайного числа для получения случайного элемента списка - PullRequest
0 голосов
/ 06 февраля 2012

Я пытаюсь получить случайный элемент списка из списка "Котировки".В настоящее время у меня есть веб-часть с пользовательским свойством, которое используется для выбора типа отображаемой цитаты.В списке «Котировки» есть цитаты для следующих категорий: «Корпоративные, Технологии и финансы». В настоящее время я использую цикл foreach, который отображает все цитаты для определенной категории. У меня есть запрос CAML для фильтрации типов котировок, которые должны отображаться.Значение, введенное в пользовательском свойстве веб-части, используется в запросе CAML для отображения кавычек.

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

protected void Page_Load(object sender, EventArgs e)
{

if (this.WebPart != null && this.WebPart.PracticeArea != null)
{
string PracticeArea = this.WebPart.PracticeArea; //get the value of the property



//getting a reference to the site location
string webUrl = SPContext.Current.Site.AllWebs["practices"].Url;

//Getting the Quotes list
using (SPSite site = new SPSite(webUrl))
{
using (SPWeb web = site.OpenWeb())
{
try
{
//getting the Quotes list
SPList quotesList = web.Lists["Quotes"];

//SPListItemCollection collLisItems = quotesList.Items; not needed

//CAML query to filter or obtain the correct quote based on Area. Value for Area is 
//passed from the custom property and used in the caml query
SPQuery quotesbySector = new SPQuery();

//creating an object to handle our random list item selection
//not too sure whether this is correct
Random rndQuote = new Random();

int num = rndQuote.Next();



//string camlquery1 = "<Where><Eq>" + "<FieldRef Name='Area'/>" + "</Eq></Where>";
string camlquery1 = @"
<Where>
<Eq>
<FieldRef Name='Area'/>
<Value Type='Text'>" + PracticeArea + @" </Value>
</Eq>
</Where>";

quotesbySector.Query = camlquery1;

SPListItemCollection collListItems = quotesList.GetItems(quotesbySector);

//SPListItem firstQuote = collListItems[0];

//for each loop might need to be removed, as we are only interested in getting a 
//random quote and not all quotes
foreach (SPListItem item in collListItems)
{

string quotes = (string)item["Quote"];
string quotesSource = (string)item["Source"];
string quotesYear = (string)item["Year"];
//string quotesArea = (string)item["Area"]; //not needed used for test purposes

plhQuotes.Controls.Add(new LiteralControl(quotes + "<br/>" + "<br/>" + quotesSource + 
"<br/>" + "<br/>" + quotesYear + "<br/>" + "<br/>"));

}


}

catch (Exception err)
{
plhErrors.Controls.Add(new LiteralControl(err.ToString()));
}
}
}






}

}

Я уверен, что есть простой способ добиться этого.Любое предложение будет с благодарностью.

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 06 февраля 2012

Извините, код, который вы разместили, кажется, немного запутался в форматировании, но я бы сделал следующее:

List<String> quoteList = new List<String>();
Random rand = new Random();
String quote;

if(quoteList.Count > 0)
{
  int index = rand.Next(quoteList.Count); // Returns 0 through number of items minus 1
  quote = quoteList[index];
}
1 голос
/ 06 февраля 2012

Вам нужно

  • количество предметов, count = collListItems.Count
  • по модулю операции, collListItems[randNumber % count]
0 голосов
/ 07 февраля 2012

С этим разобраться довольно просто.Это было сделано следующим образом:

SPListItemCollection collListItems = quotesList.GetItems(quotesbySector);

//Getting a random list item from based on the PracticeArea value entered in webpart's 
//custom property, which is used in the CAML query above to filter the results returned
Random randomQuote = new Random();
int randItem = randomQuote.Next(0, collListItems.Count);

collListItems[randItem].ToString();

SPListItem ourQuote = collListItems[randItem];

string quote = (string)ourQuote["Quote"];
string quoteSource = (string)ourQuote["Source"];
string quoteYear = (string)ourQuote["Year"];

if (quoteYear != null)
{
plhQuotes.Controls.Add(new LiteralControl(quote + "<br/><br/>" + quoteSource + "<br/>
<br/>" + "Year: " + quoteYear));
}
else
{
plhQuotes.Controls.Add(new LiteralControl(quote + "<br/><br/>" + quoteSource));
}

Sorted !.Спасибо всем за предложения.

0 голосов
/ 06 февраля 2012

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

//Assuming individual lists for categories (ex: technologyList)
//for technology list
Random random = new Random(seed); //seed is optional
var itemNumber = random.Next(0, technologyList.Count);
return technologyList[itemNumber];

Это просто и грубо (и предполагает, что вы инкапсулировалифункциональность в методе), но он должен дать вам основной ориентир.Я не прочитал полный пример кода, поэтому измените его, чтобы завершить работу.

...