我正在将从另一种语言继承而来的进程转换为C#。 过程中的许多步骤循环遍历大量记录(100K-200K)进行计算。 作为这些过程的一部分,通常会查找另一个列表以检索某些值。 我通常会将这种事情移动到SQL语句中(在我们能够做到的情况下,我们已经这样做了),但在这些情况下,确实没有简单的方法可以做到这一点。 在某些地方,我们尝试将代码转换为存储过程并发现它的效果并不像我们希望的那样好。
实际上,代码执行以下操作:
var match = cost.Where(r => r.ryp.StartsWith(record.form.TrimEnd()) &&
r.year == record.year &&
r.period == record.period).FirstOrDefault();
cost是一个本地的List类型。如果我只在一个字段上进行搜索,我可能会将它移入Dictionary中。记录也不总是唯一的。
显然,这样做非常慢。
我发现开源库I4O可以构建索引,但它在我的各种查询中失败了(我确实没有时间尝试调试源代码)。它也不支持.StartsWith或.Contains(其中.StartsWith更为重要,因为很多原始查询利用了搜索“A”会在“ABC”中找到匹配项的事实)。
还有其他的项目(开源或商业)可以做到这一点吗?
编辑:
根据反馈结果,我进行了一些搜索,找到了Power Collections,它支持具有非唯一键的字典。
我测试了ToLookup(),效果非常好——虽然仍然不如原始代码快,但至少是可以接受的。时间从45秒降到了3-4秒。我会看看Trie结构来进行其他查找。
谢谢。
Parallel.ForEach
),具体取决于是否有必要按特定顺序迭代,再加上索引查找。 - Adam Houldsworth