C# 随机排序的IEnumerable每次使用时都会更改顺序,而不是重新排序一次
我使用OrderBy和Random()洗牌一个IEnumerable,然后使用ElementAt选择其中的一些 简化版: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
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);