XML中的非完全匹配

时间:2015-03-31 20:53:22

标签: c# xml string

我有问题。我必须使用字符串在XML中输入相等的值,字符串在textBox中输入。我要做的是让程序更“智能”,这意味着,如果我键入“kraków”而不是“Kraków”,程序应该找到位置。

代码示例:

public static IEnumerable<XElement> GetRowsWithColumn(IEnumerable<XElement> rows, String name, String value)
{
    return rows
        .Where(row => row.Elements("col")
            .Any(col =>
                col.Attributes("name").Any(attr => attr.Value.Equals(name))
                && col.Value.Equals(value)));
}

如果我键入“Kraków”,那么我会从XML中得到很好的回复,但是当我输入“kraków”时,就没有匹配。我该怎么办?

如果我再问一个问题,我怎么能提示像google这样?如果您输入“progr”,谷歌会向您显示“编程”。

3 个答案:

答案 0 :(得分:0)

只需创建一个比较字符串的函数。你可以使用任何你想要的标准

    ...
    col.Attributes("name").Any(attr => AreEquivelant(attr.Value, name)) 
    ...

private static bool AreEquivelant(string s1, string s2)
{
    //compare the strings however you want
}

答案 1 :(得分:0)

您可以在使用

时比较您的值
.ToUpper()

为你的字符串。

要像谷歌一样获得这些提示,您可能需要正则表达式。 欲了解更多信息,请点击此处:

Learning Regular Expressions

答案 2 :(得分:-1)

你会找到一个距离。距离是两个单词之间的差异。你可以使用Levenshtein这个。

来自维基百科:

  

在信息理论和计算机科学中,Levenshtein距离是用于测量两个序列之间差异的字符串度量。非正式地说,两个单词之间的Levenshtein距离是将一个单词改为另一个单词所需的最小单字符编辑数(即插入,删除或替换)。

基本用例:

static void Main(string[] args)
{
    Console.WriteLine(Levenshtein.FindDistance("Alois", "aloisdg"));
    Console.WriteLine(Levenshtein.FindDistance("Alois", "aloisdg", true));
    Console.ReadLine();
}

输出

3
2

降低价值,匹配更好。 对于你的例子,你可以使用它,如果匹配低于某些东西(比如2)你得到了一个有效的匹配。

我做了一个here

代码:

public static int FindDistance(string s1, string s2, bool forceLowerCase = false)
{
    if (String.IsNullOrEmpty(s1) || s1.Length == 0)
        return String.IsNullOrEmpty(s2) ? s2.Length : 0;
    if (String.IsNullOrEmpty(s2) || s2.Length == 0)
        return String.IsNullOrEmpty(s1) ? s1.Length : 0;
    // not in Levenshtein but I need it.
    if (forceLowerCase)
    {
        s1 = s1.ToLowerInvariant();
        s2 = s2.ToLowerInvariant();
    }
    int s1Len = s1.Length;
    int s2Len = s2.Length;
    int[,] d = new int[s1Len + 1, s2Len + 1];
    for (int i = 0; i <= s1Len; i++)
        d[i, 0] = i;
    for (int j = 0; j <= s2Len; j++)
        d[0, j] = j;
    for (int i = 1; i <= s1Len; i++)
    {
        for (int j = 1; j <= s2Len; j++)
        {
            int cost = Convert.ToInt32(s1[i - 1] != s2[j - 1]);
            int min = Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1);
            d[i, j] = Math.Min(min, d[i - 1, j - 1] + cost);
        }
    }
    return d[s1Len, s2Len];
}