我有一个继承的过程,我正在从另一种语言转换为 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 是本地列表类型。如果我只在一个字段上进行搜索,我可能会将其移至字典中。记录也不总是唯一的。
显然,这真的很慢。
我遇到了可以构建索引的开源库I4O,但是它在各种查询中对我来说都失败了(而且我真的没有时间尝试调试源代码)。它也不适用于 .StartsWith 或 .Contains (StartsWith 更为重要,因为许多原始查询都利用了搜索“A”会在“ABC”中找到匹配项的事实)。
有没有其他项目(开源或商业)做这种事情?
编辑:
我根据反馈进行了一些搜索,发现Power Collections支持具有非唯一键的字典。
我测试了 ToLookup() 效果很好 - 它仍然没有原始代码那么快,但它至少是可以接受的。它从 45 秒减少到 3-4 秒。我将看一下其他查找的 Trie 结构。
谢谢。