Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 随机排序的IEnumerable每次使用时都会更改顺序,而不是重新排序一次_C#_Asp.net_Asp.net Mvc_Umbraco - Fatal编程技术网

C# 随机排序的IEnumerable每次使用时都会更改顺序,而不是重新排序一次

C# 随机排序的IEnumerable每次使用时都会更改顺序,而不是重新排序一次,c#,asp.net,asp.net-mvc,umbraco,C#,Asp.net,Asp.net Mvc,Umbraco,我使用OrderBy和Random()洗牌一个IEnumerable,然后使用ElementAt选择其中的一些 简化版: var r = new Random(DateTime.Now.Millisecond); IEnumerable<IPublishedContent> testimonialsShuffled = testimonials.OrderBy(x => r.Next()); var testimonialA = testimonialsShuffled.El

我使用OrderBy和Random()洗牌一个IEnumerable,然后使用ElementAt选择其中的一些

简化版:

var r = new Random(DateTime.Now.Millisecond);
IEnumerable<IPublishedContent> testimonialsShuffled = testimonials.OrderBy(x => r.Next());

var testimonialA = testimonialsShuffled.ElementAt(0);
var testimonialB = testimonialsShuffled.ElementAt(1);
var testimonialC = testimonialsShuffled.ElementAt(2);
类似地,我希望这段代码会产生三个相等的变量,但它们通常是不同的(因为鉴定书中的第一个元素每次都会发生变化)


我的目标是只对IEnumerable随机排序一次(这样它的顺序在不同的页面加载上会发生变化,但在单个视图中不会多次)。我做错了什么?

OrderBy
会生成一个
IEnumerable
,每次访问它时都会重新评估它(简单地说)。
为了得到一个固定的结果,你必须“强制”它进入一个列表

var r = new Random(DateTime.Now.Millisecond);
var testimonialsShuffled = testimonials.OrderBy(x => r.Next()).ToList();

var testimonialA = testimonialsShuffled.ElementAt(0);
var testimonialB = testimonialsShuffled.ElementAt(1);
var testimonialC = testimonialsShuffled.ElementAt(2);

应该可以做到这一点。

OrderBy()
使用延迟执行,每次开始枚举时都会执行它(这是
ElementAt()
所做的)。在列表或数组中具体化可枚举项。谢谢Franz,将其转换为列表确实解决了这个问题。
var r = new Random(DateTime.Now.Millisecond);
var testimonialsShuffled = testimonials.OrderBy(x => r.Next()).ToList();

var testimonialA = testimonialsShuffled.ElementAt(0);
var testimonialB = testimonialsShuffled.ElementAt(1);
var testimonialC = testimonialsShuffled.ElementAt(2);