2016-08-21 17 views
1

我正在讀取cookie中的guid以製作一個由linq隨機化的列表,如果cookie爲空,我將生成新的guid並將其保存到cookie中,然後使用它,但列表不是隨機化的。如何從保存的guid中隨機化linq列表?

爲什麼?

var questions = IZBSC.UI.Components.Utility.GetQuestionBank(Model.ExamId); 
var random = ""; 
if (Request.Cookies["Rnd"] == null) 
{ 
    random = Guid.NewGuid().ToString(); 
    HttpCookie cookie = new HttpCookie("Rnd", random.ToString()) 
    { 
     HttpOnly = true, 
     Expires = DateTime.Now.AddDays(1) 
    }; 
    Response.Cookies.Add(cookie); 
} 
else 
{ 
    random= Request.Cookies["Rnd"].Value; 
} 

@foreach (var question in questions.OrderBy(q =>random).Take(questions.Count).ToList()) 
{...} 
+0

爲什麼你使用cookie來存儲Guid? –

+0

@LucianBumb那還有什麼? –

回答

1

我想你可能要改爲儲存種子一個GUID,並使用類似(工作示例)代碼:

var list = new List<int>(){1, 2, 3, 4, 5, 6, 7, 8}; 

var seed = 3; // CREATE THIS RANDOM NUMBER AND STORE IT INSTEAD OF THE GUID 

var rnd = new Random(seed); 

var ordered = list.OrderBy(r => rnd.Next()); 

foreach(var item in ordered) 
{ 
    Console.WriteLine(item); 
} 

所以,你的代碼看起來像:

var questions = IZBSC.UI.Components.Utility.GetQuestionBank(Model.ExamId); 
var seed; 
if (Request.Cookies["Rnd"] == null) 
{ 
    seed = new Random().Next(); 
    HttpCookie cookie = new HttpCookie("Rnd", seed.ToString()) 
    { 
     HttpOnly = true, 
     Expires = DateTime.Now.AddDays(1) 
    }; 
    Response.Cookies.Add(cookie); 
} 
else 
{ 
    seed = int.Parse(Request.Cookies["Rnd"].Value); 
} 

var random = new Random(seed); 

@foreach (var question in questions.OrderBy(q =>random.Next())) 
{...} 
1

您正在使用OrderBy聲明相同的值,這就是爲什麼你所得到的相同的順序。 您可以使用類似questions.OrderBy(q =>Guid.NewGuid())這樣的順序對列表進行整理,但您希望爲後續請求保留相同的種子值,因此您應該使用Random類來完成此操作。