Общий список C # <T>- Как случайным образом назначить «ранг» для каждого элемента? - PullRequest
1 голос
/ 02 декабря 2010

Итак, у меня есть следующий общий список:

var topTenSomething = new List<Something>();

Вот Что-то:

public class Something
{
   public string Name { get; set; }
   public int Rank { get; set; }
}

Итак, я хочу случайным образом назначить свойство «Ранг», но его необходимо заказать из 1-го числа элементов в коллекции.

Так что, если в коллекции 3 элемента, я хочу случайным образом назначить ранги от 1 до 3:

  1. Некоторое имя
  2. Некоторое другое имя
  3. Что-то еще

Тогда в следующий раз это может быть:

  1. Некоторое другое имя
  2. Некое имя
  3. Что-то еще

Знаешь, что я имею в виду?

Не уверен, как это сделать - есть идеи?

Это для простого R & D-прототипа - так что не беспокойтесь о производительности / почему я это делаю.(реальный будет иметь ранг, назначенный базой данных)

Доволен либо версией LINQ / non-LINQ - до тех пор, пока она работает.

Ответы [ 2 ]

5 голосов
/ 02 декабря 2010

Как это:

var rand = new Random();
var sequence = Enumerable.Range(0, list.Count).OrderBy(i => rand.Next()).ToList();

for(var i = 0; i < list.Count; i++)
    list[i].Rank = sequence[i];

Если вы хотите, чтобы список сортировался по случайному рангу:

var rand = new Random();
list.Sort((a, b) => rand.Next(-1, 2));    //Exclusive upper bound
for(var i = 0; i < list.Count; i++)
    list[i].Rank = i;

Однако это неправильный порядок (a < b не означает b > a) и может привести к неожиданным результатам.

0 голосов
/ 02 декабря 2010

Это должно работать:

List<Something> somethings = new List<Something>();

/* TODO: populate list here... */

Random rand = new Random();
somethings.ForEach(s=>s.Rank = rand.Next(1, somethings.Count - 1));
...