2015-03-31 103 views
0

我遇到问题了。我必须从XML中获得与textBox中键入的字符串相同的值。我需要做的是让程序更“智能”,这意味着,如果我输入“kraków”而不是“Kraków”,程序应该找到位置。XML中不完全匹配

示例代码:

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))); 
} 

如果键入“克拉科夫”然后我从XML不错的反响,但是当我键入“克拉科夫”没有匹配。我该怎么办?

如果我可以再问一个问题,我该如何提示如谷歌有?如果你输入“progr”,google会显示你“编程”的例子。

回答

0

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

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

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

可惜这不是解决办法,怎么也有像“别尔斯克 - 比亚拉”“新维斯城市”,当你键入没有第二上,和“ - ”没有匹配。 – 2015-03-31 20:59:57

-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]; 
} 
+0

谨慎解释downvote? – aloisdg 2015-03-31 21:11:06

0

,而你使用

.ToUpper() 

为你的字符串你可以比较你的价值。

为了得到这些提示,谷歌有,你可能需要正则表达式。 详细请看这里:

Learning Regular Expressions