2013-02-20 57 views
0

我正在查詢對象列表。使用Linq選擇數據時生成蘭特數的調用方法

其中一些對象具有可能具有空值的propertie startTime。

對於那些我想生成一個隨機數的情況。對於其他情況下,我想獲得當前時間和相應的項目開始時間

var data = List.Select(e => new myCustomItem 
          { 
           Item = e, 
           TimeDistance = (e.StartTime.HasValue ? (e.StartTime.Value - DateTime.Now).TotalMinutes : RandomNumber(-5000, 5000)) 
          }) 
       .OrderBy(e => e.TimeDistance) 
       .ToList(); 

這是應該有一個空值,每個結果被調用的函數之間的不同。

private int RandomNumber(int min, int max) 
    { 
     Random random = new Random(); 
     return random.Next(min, max); 
    } 

問題是,所有的結果都是reciving相同的值。

對於其他已分配startDate(非null)的人員,它正在執行計算。

+4

不要在每次調用生成'Random'的新實例,只能創建一個和重新使用。 – CodesInChaos 2013-02-20 10:57:22

+0

如果兩個選項都不爲空,它們如何接收'null'? – Andrey 2013-02-20 10:59:01

+0

錯誤!請參閱編輯 – Lothre1 2013-02-20 10:59:49

回答

1

如果我理解正確的,你想是這樣的:

var random = new Random(); 
var data = List.Select(e => new myCustomItem 
{ 
    Item = e , 
    TimeDistance = (e.StartTime.HasValue ? 
     (e.StartTime.Value - DateTime.Now).TotalMinutes : 
      Enumerable.Range(-5, 5).OrderBy(i => random.NextDouble()).ToList().First()) 
}).OrderBy(e => e.TimeDistance).ToList(); 
+1

你是認真的嗎?爲每次迭代構建和排序10000個10000個隨機數的項目列表? – 2013-02-20 11:14:04

+0

謝謝voo,我所要做的就是通過引用前一個instanteated新隨機對象的方法來調用自定義方法RandomNumber()。就像你在第一行所做的一樣。 (順便說一句,我只需要在隨機過程結束時排序):) – Lothre1 2013-02-20 11:14:11

+0

不客氣。 Gert是對的,linq隨機替代對於大範圍來說是一個壞主意。但是你可以用它來做小的 – Alex 2013-02-20 11:18:11