在任何位置使用通配符按字符串过滤记录

时间:2015-04-15 11:30:42

标签: c# filter wildcard

我想用lambda表达式过滤记录。条件是它是否包含给定的字符串,或几乎相同的字符串,其中包含一个字符的差异。 几乎相同的意思是:其中一个字符可以是任何字符,但只能是一个字符。

例如: 搜索字符串:' ABC'那么条件必须是:' [任何char] BC'或者' A [任何字符] C'或者' AB [任何字符]'

有谁知道任何专业解决方案? 提前谢谢。

解决方案(感谢LiamK):

         var count = s1.Zip(s2, (c1, c2) => c1 == c2 ? 0 : 1).Sum();

1 个答案:

答案 0 :(得分:1)

您要查找的指标称为两个字符串之间的Levenshtein距离。您可以创建此算法的实现,然后在where子句中使用它:

public IEnumerable<string> MyFunc(string searchString)
{
    return myThingToSearch.Where(x => LevenshteinDistance(x, searchString) <= 1);
}

public static int LevenshteinDistance(string s1, string s2)
{
    if (s1 == s2)
    {
        return 0;
    }

    if (s1.Length == 0)
    {
        return s2.Length;
    }

    if (s2.Length == 0)
    {
        return s1.Length;
    }

    int[] v0 = new int[s2.Length + 1];
    int[] v1 = new int[s2.Length + 1];
    for (int i = 0; i < v0.Length; i++)
    {
        v0[i] = i;
    }

    for (int i = 0; i < s1.Length; i++)
    {
        v1[0] = i + 1;

        for (int j = 0; j < s2.Length; j++)
        {
            var cost = (s1[i] == s2[j]) ? 0 : 1;
            v1[j + 1] = Math.Min(v1[j] + 1, Math.Min(v0[j + 1] + 1, v0[j] + cost));
        }

        for (int j = 0; j < v0.Length; j++)
        {
            v0[j] = v1[j];
        }
    }
    return v1[s2.Length];
}

旁注:Levenshtein距离指标也会匹配像&#39; BC&#39;或者&#39; ABCD&#39;到搜索字符串&#39; ABC&#39;因为这些字符串在技术上只是“一个接一个”。来自搜索字符串。我不确定这是否可以在您的规范中接受。如果没有,请告诉我们。该问题是近似字符串匹配的一个子集,您可以使用Hamming距离