2010-12-02 4 views
1

だから私は、次の一般的なリストを持っている:C#汎用リスト<T> - ランダムに各アイテムに「ランク」を割り当てる方法

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

ので、私はランダムに「ランク」プロパティを割り当てたいが、それは1から注文する必要があります。ここ

var topTenSomething = new List<Something>(); 

ものです - コレクション内のアイテムの数。

コレクションが3つのアイテムを持っているのであれば、私はランダムにからランクを割り当てる1〜3:

  1. いくつかの名前
  2. 他の名前

その後、次の何か他のもの時間:それは可能性があります:

  1. いくつかの他の名前
  2. いくつかの名前
  3. 何か他

私が何を意味するか知っていますか?

どのように行うのかわかりません - 考え方は?

これは単純なR & Dプロトタイプのためです - パフォーマンスについて心配しないでください/なぜ私はこれをやっているのですか? (実際のデータベースにはランクが割り当てられます)

LINQ/non-LINQバージョンのいずれかに満足している限り。このよう

+0

はランキングが一意である必要がありますか? –

+0

コレクションをソートしますか? – SLaks

+0

@Adam Spicer - yes/ – RPM1984

答えて

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 < bb > aを意味するものではありません)と予期しない結果が生じることがあります。

+1

私はあなたのOrderBy lamdbaがIComparable契約を破ると思います。同じ 'i'が繰り返し呼び出しで異なる値になってしまいます。 –

+0

@Joel:わかりません。私はそれを試したことはありません。これは直接IComparableではないことに注意してください。 – SLaks

+0

@Joel、それは動作します、私はテストのために自分自身で似たようなことをしました。実装によって誓うことはできませんが、恐らく各項目のラムダ結果がキャッシュされるため、高価な操作が繰り返されることはありません。 –

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

その後、あなたはそれを並べ替えたいと思った。これを追加してください: somethings = somethings.OrderBy(s => s.Rank).ToList(); –