我有问题。我必须使用字符串在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”,谷歌会向您显示“编程”。
答案 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()
为你的字符串。
要像谷歌一样获得这些提示,您可能需要正则表达式。 欲了解更多信息,请点击此处:
答案 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];
}