c# - 比较两个列表时提高性能

标签 c# performance list

在比较两个列表中的项目时,我有哪些选择?我遇到了一些性能问题,我想知道是否有更快的替代方案:

int[] foo = { 1, 2, 3, 4, 5 };
int[] bar = { 6, 7, 8, 9, 1 };

var result = foo.Any(x => bar.Contains(x));

无论我是使用 lambda 方法还是自己使用 foreach,我都认为性能损失仍然是 O(N^2)。我可以做些什么来影响它吗?

最佳答案

您可以使用 Enumerable.Intersect :

var result = foo.Intersect(bar).Any();

创建 Set<T>来自 bar项,然后枚举 foo直到找到第一个匹配项。在内部看起来像:

Set<int> set = new Set<int>();

foreach (int local in bar) // M times
    set.Add(local); // O(1)

foreach (int value in foo) // N times max
{
    if (!set.Remove(value)) // O(1)
        continue;

    yield return value;
}

正如 Patryk Ćwiek 正确指出的那样,这给了你 O(N+M) 而不是 O(N*M)

关于c# - 比较两个列表时提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21426042/

相关文章:

c# - 我们可以有一个多页的 JPEG 图像吗?

c# - Ok() 方法 new ObjectResult() 有什么区别吗?

asp.net-mvc - ASP.NET MVC - 脚本组合

python - 为什么 python 在列表理解中要求括号

c# - 如何使用修剪功能修剪列表内部

c# - 在跟踪索引 C# 的同时快速排序数据数组

c# - 如何在 Windows 窗体/Window Mobile 应用程序中调整动态控件的大小?

performance - 从另一台 PC 访问 Tomcat Web 应用程序速度慢

performance - 在哪里可以找到某些 Numpy 方法的效率 O(n)?

ios - IOS 应用程序的下拉菜单