【问题标题】:Quickest way to randomly re-order a LINQ collection?随机重新排序 LINQ 集合的最快方法?
【发布时间】:2011-05-29 01:22:15
【问题描述】:

我有一个列表

我想重新排序,所以它们的顺序是随机的。

最快的方法是什么(最快,我的意思是最少的代码)

【问题讨论】:

标签: c# .net linq c#-4.0


【解决方案1】:

注意: 根据 mquander 的评论,以下答案不是执行“随机排序”的推荐方法,因为它在语义上不正确,与公认的 shuffle 算法相比效率不高,它基于Guids 的私有实现细节, 甚至滥用 LINQ 查询语法。但是,它是“最少的代码”(就由自己编写而不是由框架处理而言)为 由 OP 要求。

var randomOrdering = yourList.OrderBy(o => Guid.NewGuid());

【讨论】:

  • 既不好看也不优雅。如果您想“按随机数排序”,则生成随机数,不要生成 GUID。如果你想打乱列表,使用打乱算法,不要“按随机数排序”。
  • mquander :我使用了另一个效果很好但出于好奇的解决方案,为什么这个答案不好?生成 GUID 是否比生成随机数需要更多时间?
  • @mquander - 更新答案以反映为什么它不是最佳解决方案,谢谢。
  • 出于好奇 - 为什么不简单地使用 data.OrderBy(o => rnd.Next());?
【解决方案2】:

如果你想随机重新排序就地你应该打乱列表,使用扩展方法是一个简单的单行。这假设您已经拥有一个基于 IList 的集合。

用法: myList.Shuffle();

public static void Shuffle<T>(this IList<T> list)  
{  
    Random rng = new Random();  
    int n = list.Count;  
    while (n > 1) 
    {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

归功于这个答案:Randomize a List<T>

【讨论】:

    猜你喜欢
    • 2022-10-04
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2015-01-19
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多