2013-12-07 5 views
0

Это пример того, что мне нужно выполнить как часть более крупной программы. Пример содержит два списка. listViewInput содержит три элемента текста: «банан», «банановое дерево» и «банановая кожура».Соответствует всем строкам

Мне нужно перебирать элементы listView и находить элемент, текст которого полностью содержится в строке textToCompare. textToCompare всегда будет иметь дополнительный текст на одной или обеих сторонах фактической строки, которую я ищу (не будет символом ==).

Проблема с этим сравнением заключается в том, что оператор If будет возвращать true для элемента listView «banana», а также «бананового дерева». Это кажется достаточно простым, но я пробовал все, что мог придумать, и мне не повезло. Любая помощь будет оценена по достоинству.

string textToCompare = "word banana tree more words"; 

for (int i = 0; i < listViewInput.Items.Count; i++) 
{ 
    if (Regex.IsMatch(textToCompare, listViewInput.Items[i].Text)) 
    { 
     listViewOutput.Items.Add(listViewInput.Items[i].Text); 
    } 
} 
+1

Каков ваш ожидаемый результат? На самом деле «banana» и «банановое дерево» являются «содержащимися в тексте» в textToCompare. – EricSchaefer

+1

начните сравнивать с самыми длинными элементами списка. то вы можете достичь своего результата – Haji

+0

@ EricSchaefer Это правда, что оба они полностью содержатся; Я попытаюсь объяснить более четко. Мой ожидаемый результат - «получить/найти» элемент списка, указав его текст, содержащийся в textToCompare. Пример: если textToCompare содержит «банановое дерево», я хочу только элемент listview, текст которого «банановое дерево». Если textToCompare содержит только «бананы», мне нужен только элемент listview, текст == «banana» и т. Д. Элементы listview являются известными и постоянными значениями, но строка может содержать другие слова до и после текста, который я ищу , – code2control

ответ

2

ОК, вот ваш пересмотренный ответ, возвращая наибольшее совпадение:

// This is the equivalent to your `listViewInput.Item` 
string[] words = new string[] { "banana", "banana tree" , "banana peel"}; 

string textToCompare = "word banana tree more words"; 

string longest_match = 
    (from word in words.OrderByDescending(w => w.Length) 
    where textToCompare.Contains(word) 
    select word).FirstOrDefault(); 

Это закончится с longest_match холдинг "банановое дерево".

Не знаете, почему вам нужно ваше регулярное выражение ... Используйте Содержит и меняйте свой массив слов на источник ваших предметов.

+0

Спасибо за ваше предложение, однако, поскольку строка содержит «банановое дерево», а не просто «банан», я не хочу, чтобы результат включал «банан». – code2control

+0

вы можете просто использовать 'silly_longest' (поскольку это глупый способ получить его). Вы можете сортировать свой эквивалент «слова» по длине, а затем, как только вы нажмете тот, который возвращает «true» для 'contains', сломайте цикл, и вы получите самый длинный результат. – Noctis

+0

Что делать, если у него были «слова» в его «listViewINput», тогда он был бы исключен, потому что он не достаточно длинный, но это не соответствует «банановому дереву» – gillyspy

0

Я не делаю C#, но алгоритмически вам понадобятся два прохода. Второй проход будет иметь логарифмическое снижение стоимости.

Я думаю, что вы должны будете:

  1. Сортировка listViewInput по длине записей
  2. затем петлевых список снова по сравнению с textToCompare. Вы можете использовать регулярное выражение, но убедитесь, что оно использует границы слов.
  3. Каждый раз, когда вы нажимаете совпадение, вы удаляете этот элемент из TextToCompare для следующей итерации. e..g удалите «банановое дерево». где-то позже в отсортированном списке «банан» не будет соответствовать

на # 2: ваши элементы ввода остаются как есть, но регулярное выражение будет динамической частью этого. как я сказал, я не делаю C#, поэтому, пожалуйста, отредактируйте синтаксис кого-то, особенно метод IsMatch:

string textToCompare = "word banana tree more words"; 

for (int i = 0; i < listViewInput.Items.Count; i++) 
{ 
    string regex = `\b'+listViewInput.Items[i].Text[i]+'\b` // e.g. `\bbanana\b` 
    if (Regex.IsMatch(textToCompare,regex)) 
    { 
     listViewOutput.Items.Add(listViewInput.Items[i].Text); 
    } 
} 
Смежные вопросы