C# 以 int 数组作为索引过滤循环的更快方法?

标签 c# arrays performance

抱歉,如果这是重复的,第一个问题...

我想对大量称为注释的结构进行操作。 但我不想对笔记的每个元素进行操作。我正在尝试使用 int 数组 (int[]) 的 filter 来跳过其中的很多内容,如下面的代码所示。

Note[] notes = new Note[]
{ 
   // Struct stuff ... 
};

int[] filter = new int[]{ 4,20,50,367... };

for (int i = 0; i < notes.Length; i++)
{
     bool flag = false;
     for (int j = 0; j < filter.Length; j++)
     {
          if (i == filter[j])
          {
               flag = true;
               break;
          }
      }

      if (flag) continue;
      // Do something on notes[i]
}

问题是,当注释数组和过滤器数组都扩展时,代码将运行非常慢(我认为)。 那么,是否有更好、更快的方法来做到这一点?请注意,过滤器的大小可以是基于其他条件的任何大小

最佳答案

我们可以在 HashSet<int> 的帮助下摆脱内部循环同时拥有更好的O(|filter| + |notes|) 时间复杂度 而不是初始的 O(|filter| * |notes|) :

Note[] notes = new Note[] { 
  ... //Struct stuff 
};

int[] filter = new int[] { 
  4, 20, 50, 367... 
};

HashSet<int> toExclude = new HashSet<int>(filter);

for (int i = 0; i < notes.Length; i++) {
  if (toExclude.Contains(i)) // O(1) time complexity 
    continue;

  //Do something on notes[i] 
}

关于C# 以 int 数组作为索引过滤循环的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55824737/

相关文章:

c# - 为什么在 owin 实现后,swagger 不起作用?

c# - 在 Web API 中返回特殊的 ASCII 字符

javascript - 如何根据 Javascript 数组中的日期计算预订价格

c - C 中 Sizeof 的行为

c# - 为什么 HttpListener 会忽略外部请求?

c# - C# 编译器不会优化 foreach 吗?

java - 服务器响应时间在负载测试期间变得非常慢

引用主键时 SQL 查询非常慢

javascript - Javascript 原型(prototype)继承中数组和数字数据类型之间有区别吗?

php - 为什么这些查询这么慢?