如何随机排序IEnumerable <>?

mar*_*zzz 3 c# ienumerable

我有这个IEnumerable:

IEnumerable<MyObject>
Run Code Online (Sandbox Code Playgroud)

我需要随机订购MyObject列表.我需要强制转换为ArrayList吗?

或者我可以直接做到吗?谢谢

编辑

这是我的实际随机顺序函数:

IList<ArchiePacchettoOfferta> list = new List<ArchiePacchettoOfferta>(m_oEnum);
for (int i = 0; i < list.Count; ++i)
{
    HttpContext.Current.Response.Write(list[i].Titolo + "<br />");
}

Random rnd = new Random();
for (int i = 0; i < list.Count; ++i)
{
    int swapIndex = rnd.Next(i + 1);
    ArchiePacchettoOfferta tmp = list[i];
    list[i] = list[swapIndex];
    list[swapIndex] = tmp;
}

for (int i = 0; i < list.Count; ++i)
{
    HttpContext.Current.Response.Write(list[i].Titolo + "<br />");
}
Run Code Online (Sandbox Code Playgroud)

它每次以相同的方式命令列表:(

seh*_*ehe 6

IEnumerable<int> ints;

var random = new Random();
var shuffled = ints.OrderBy(i => random.Next()).ToList();
Run Code Online (Sandbox Code Playgroud)

ToList仅用于确保在多次重复遍历迭代时返回相同(随机)顺序.当然,如果你不再需要原版,你可以随便洗牌

ints = ints.OrderBy(i => random.Next()).ToList();
Run Code Online (Sandbox Code Playgroud)

更新

关于是否应该仅依赖OrderBy比较元素,有一些讨论.如果你不想信任你的.NET实现来做到这一点,请拼写出来:

var random = new Random();
var shuffled = ints
      .Select(i => new { key=random.Next(), i })
      .OrderBy(tmp => tmp.key)
      .Select(tmp => tmp.i)
      .ToList();
Run Code Online (Sandbox Code Playgroud)

有关此解决的潜在问题的更多背景,请参阅以下链接(主要是当前样本的性能下降,以及非均匀分布的风险):

  • 是的,但这与暗示你应该依赖它是不一样的......特别是当这样做的订购比执行洗牌更昂贵. (2认同)
  • 我在博客文章中找到了一句话:http://blogs.msdn.com/b/ericlippert/archive/2011/01/31/spot-the-defect-bad-comparisons-part-four.aspx"Shuffling不是排序;它与排序相反,所以不要使用排序算法进行混洗.有许多高效的随机算法很容易实现." (2认同)
  • @乔恩:感谢法医工作。我只能说,我们(非常)需要.NET框架中的标准Shuffle扩展。它可以做正确的事情,进行适当的优化,并总体上防止意外 (2认同)