c# - 这两种改组 IEnumerable 的算法之间是否存在性能差异?

标签 c# linq performance ienumerable

这两个问题给出了洗牌 IEnumerable 的相似算法:

下面是两种并排的方法:

public static IEnumerable<T> Shuffle1<T> (this IEnumerable<T> source)
{
    Random random = new Random ();
    T [] copy = source.ToArray ();

    for (int i = copy.Length - 1; i >= 0; i--) {
        int index = random.Next (i + 1);
        yield return copy [index];
        copy [index] = copy [i];
    }
}


public static IEnumerable<T> Shuffle2<T> (this IEnumerable<T> source)
{
    Random random = new Random ();
    List<T> copy = source.ToList ();

    while (copy.Count > 0) {
        int index = random.Next (copy.Count);
        yield return copy [index];
        copy.RemoveAt (index);
    }
}

它们基本上是相同的,除了一个使用List,一个使用数组。从概念上讲,第二个对我来说似乎更清楚。但是使用数组是否可以获得实质性的性能优势?即使 Big-O 时间相同,如果快几倍,也会产生明显的差异。

最佳答案

由于 RemoveAt,第二个版本可能会慢一点。列表实际上是数组,当您向它们添加元素时它会增长,因此,中间的插入和删除很慢(事实上,MSDN 指出 RemoveAt 的复杂度为 O(n))。

无论如何,最好的办法是简单地使用分析器来比较这两种方法。

关于c# - 这两种改组 IEnumerable 的算法之间是否存在性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4412405/

相关文章:

c# - LinQ to SQL 忽略 != 虚拟属性上的 null

performance - 分析器结果的 Marklogic 查询优化

c# - 我有一个需要打包的 C# WPF 应用程序。有什么建议么?

c# - 获取完整的英文月份名称

c# - 无法从 docker 上运行的 .net 核心应用程序连接到 SQL Server express

c# - 为什么 Include 没有任何效果?

c# - 使用 CSLA 在 C# .NET 中禁用文本框

linq - NHibernate 3 LINQ 内连接问题与三个跳转 : NotSupportedException

node.js - RabbitMQ:如何限制消费率

asp.net - 避免向服务器的每个请求附加 cookie