gpt4 book ai didi

c# - ConcurrentDictionary.Where 对于基于 int 数组(键字段)的过滤非常慢

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:04 25 4
gpt4 key购买 nike

我有以下内容

  var links = new ConcurrentDictionary<int, Link>();

其中填充了大约 20k 条记录,我有另一个字符串数组 (List),我使用以下方法将其转换为 int 数组。

var intPossible = NonExistingListingIDs.Select(int.Parse); //this is very fast but need to be done

这是相当快的。但我想创建一个新列表或仅过滤掉与 ConcurrentDictionary 的 Key 元素匹配的 intPossible 数组中实际存在的内容的“链接”。

我有以下使用 where 子句的内容,但实际过滤需要大约 50 秒,这对于我想做的事情来说非常慢。

var filtered = links.Where(x => intPossible.Any(y => y == x.Key)).ToList();

我知道 intersect 非常快,但我有一个整数数组,并且 intersect 不能与 ConcurrentDictionary 一起使用

我怎样才能将链接过滤得更快而不是 50 秒。

最佳答案

您需要用更快速的东西替换您的 O(n) 内部查找,例如提供 O(1) 查找复杂度的哈希集。

所以

var intPossible = new HashSet<int>(NonExistingListingIDs.Select(int.Parse));

var filtered = links.Where(x => intPossible.Contains(x.Key)).ToList();

这将避免为 links 中的每个项目迭代大部分 intPossible

或者,Linq 是您的 friend :

var intPossible = NonExistingListingIDs.Select(int.Parse);
var filtered =
links.Join(intPossible, link => link.Key, intP => intP, (link, intP) => link);

Join 的实现与我在上面所做的大致相同。

关于c# - ConcurrentDictionary.Where 对于基于 int 数组(键字段)的过滤非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com