C#通用列表<t> - 如何随机为每个项目分配“等级”?</t>

时间:2010-12-02 03:22:37

标签: c# linq collections random ranking

所以我有以下通用列表:

var topTenSomething = new List<Something>();

这是 Something:

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

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

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

  1. 一些名字
  2. 其他名称
  3. 其他东西
  4. 然后下一次,它可能是:

    1. 其他名称
    2. 一些名字
    3. 其他东西
    4. 知道我的意思吗?

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

      这是一个简单的R&amp; D原型 - 所以不要担心性能/为什么我这样做。 (真实的将由数据库分配等级)

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

2 个答案:

答案 0 :(得分: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];

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

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),可能会导致意外结果。

答案 1 :(得分:0)

这应该有效:

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));