从输入字符串中包含的集合中找出最长的字符串的最快方法

时间:2019-03-07 09:45:08

标签: c# string-matching

我有一个很大的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进行了排序,并且假设我已基于以下内容提取了一个名为List<MyClass>的{​​{1}}:我之前提到的字典,我会做的

SubSet

我在这里可以看到的最明显的问题是,如果期望的结果是在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; } 的结尾,我需要遍历数千条记录。您能想到实现我的目标的最佳方法吗?改进我当前代码的方法?

1 个答案:

答案 0 :(得分:0)

也许,您可以在

之类的递归函数中使用Linq方法
public string test(string input)
{
    string result = Subset.FirstOrDefault(a => a == input);
    if (result == null)
        return test(input.Substring(0, input.Length - 2));
    else
        return result;
}