C#通用列表<T> - 如何随机为每个项目分配"等级"?

RPM*_*984 1 c# linq random collections ranking

所以我有以下通用列表:

var topTenSomething = new List<Something>();
Run Code Online (Sandbox Code Playgroud)

这是件事:

public class Something
{
   public string Name { get; set; }
   public int Rank { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以我想随机分配"Rank"属性,但需要从集合中的1个项目中进行排序.

因此,如果集合有3个项目,我想随机分配从1到3的排名:

  1. 一些名字
  2. 一些其他名称
  3. 还有别的

然后下一次,它可能是:

  1. 一些其他名称
  2. 一些名字
  3. 还有别的

明白我的意思了吗?

不知道怎么做 - 任何想法?

这是一个简单的研发原型 - 所以不要担心性能/为什么我这样做.(真实的将由数据库分配排名)

对LINQ /非LINQ版本感到满意 - 只要它有效.

SLa*_*aks 5

像这样:

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];
Run Code Online (Sandbox Code Playgroud)

如果您希望按随机排名对列表进行排序:

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;
Run Code Online (Sandbox Code Playgroud)

但是,这不是有效的排序(a < b并不意味着b > a),可能会导致意外结果.

  • @Joel.@Anthony:我检查过来源.`OrderBy`预先创建了一个键数组; 每个'GetEnumerator`调用每个元素只调用一次键选择器. (2认同)