我有这个 IEnumerable :
IEnumerable<MyObject>
我需要随机排序 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 />");
}
它每次都以相同的方式对列表进行排序:(
最佳答案
IEnumerable<int> ints;
var random = new Random();
var shuffled = ints.OrderBy(i => random.Next()).ToList();
ToList 仅用于确保在多次迭代 shuffled 时返回相同的(随机)顺序。当然,如果您不再需要原件,您可以“就地”随机播放
ints = ints.OrderBy(i => random.Next()).ToList();
更新
有一些关于您是否应该依赖 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();
查看这些链接以了解有关此解决的潜在问题的更多背景信息(主要是当前样本的性能下降,但也存在分布不均匀的风险):
- Jon Skeet's blog (“前面可能有麻烦”部分)
- Shuffle string array without duplicates (那是埃里克在争论 简短的版本)
- Eric Lipperts blog: Shuffling is not sorting (这是相反的论点)
关于c# - 我如何随机订购 IEnumerable<>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569422/