c# - 我如何随机订购 IEnumerable<>?

标签 c# ienumerable

我有这个 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();

查看这些链接以了解有关此解决的潜在问题的更多背景信息(主要是当前样本的性能下降,但也存在分布不均匀的风险):

关于c# - 我如何随机订购 IEnumerable<>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569422/

上一篇:C# 类型转换问题

下一篇:c# - 反之foreach

相关文章:

enums - 如何迭代枚举,并转换 obj

c# - 除了早期的 .NET Framework 版本之外,Visual Studio 能否针对早期的 C# 语法?

c# - Application Insights - ILogger 参数呈现为自定义维度中的对象名称

C# Interface IEnumerable Any() 没有指定泛型类型

ienumerable - 使用 IEnumerable<T> 和 WebGet 序列化数据

c# - 寻找 IEnumerable/IEnumerator 的更快实现

extension-methods - .NET 为什么现有列表上的 IEnumerable.ToList() 创建新数组

c# - 将 Microsoft Word 智能引号转换为直引号

c# - 保存到 Active Directory - 拒绝域管理员访问

c# - 使用外部提供程序登录 IdentityServer 不能长时间使用 login_hint 或 acr_values