【发布时间】:2019-07-29 03:38:03
【问题描述】:
我有一个非常大的 List<MyClass>(大约 600.000 条记录 +),我需要在其中提取 MyClass.Property1 与我的输入字符串完全匹配或最接近的记录。但是,即使看起来,这也不是模糊字符串匹配问题,所以我不能使用 Levenshtein 距离。为了稍微澄清一下,我给你举个例子。
假设以下是我的数据集(仅列出MyClass.Property1):
242
2421
2422
24220
24221
24222
24223
24224
现在我期望的是,如果我有输入 2422,我希望在输出中给出第三条记录。如果我输入 24210,我希望输出第二条记录,这是我的输出中包含的最长字符串。为了让事情变得更快,当我填写List<MyClass> 时,我已将字符串中第一个数字更改的索引保存在Dictionary<int,int> 中(例如从 19999 到 20000),因此我可以减小数据集的大小我'要寻找比赛。我想知道的是:达到我的目标的最快方法是什么?
我唯一能想到的就是这样的:
因为我确定List<MyClass> 是由MyClass.Property1 排序的,就像示例中一样,假设我已经根据我之前提到的字典提取了一个名为SubSet 的List<MyClass>,我会这样做
MyClass result = null;
foreach(MyCLass m in SubSet)
{
if (input.Contains(m.Property1))
{
// if the 2 strings are equal i've found the exact match
if(input == m.Property1)
return m.Property1;
else
result = m;
}
else
return result;
}
我在这里可以看到的最明显的问题是,如果想要的结果在 SubSet 的末尾,我需要循环数千条记录,你能想出更好的方法来达到我的目标吗?改进我当前的代码?
【问题讨论】:
-
会在同一个数据上多次调用这个“find”方法吗?换句话说,您会接受较慢的“启动”时间以使“查找”方法更快吗?
-
@C.Evenhuis 可能是的。但是有可能在实例期间永远不会调用此方法。要回答,这取决于启动速度有多慢
标签: c# string-matching