2015-03-31 2 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, но когда я типа «Кракову» нет матча. Что мне делать?

И если я могу задать еще один вопрос, как я могу предложить такие запросы, как google? Если вы наберете «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

К сожалению, это не решение, сог есть такие города, как «Бельско-Бяла» «Nowa Wieś» и при вводе без второго верхнего, и «-» нет матча. –

-1

Вы собираетесь найти расстояние. Расстояние - это разница между двумя словами. Вы можете использовать Levenshtein для этого.

Материал из Википедии:

В теории информации и компьютерной науки, Левенштейна является строкой метрики для измерения разности между двумя последовательностями. Неформально расстояние Левенштейна между двумя словами - это минимальное количество односимвольных изменений (например, вставки, удаления или замены), необходимые для смены одного слова на другое.

Основной UseCase:

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

Уход за пояснением? – aloisdg

0

Вы могли бы сравнить свои значения при использовании

.ToUpper() 

для ваших строк.

Чтобы получить эти подсказки как google, вам может понадобиться регулярное выражение. Более посмотреть здесь:

Learning Regular Expressions

Смежные вопросы