2013-02-12 5 views
1

Я пытаюсь выяснить, как использовать текстовый файл, полный сокращений, для подтверждения и автоматической корректировки списка ключевых слов. Например, я мог бы иметь список, который выглядит, как это в моем текстовом поле:Использование текстового файла для доказательства TextBox

nec 1080p television 
nec hdtv television 
nec lcd tv 
etc. 

И в моем текстовом файле, я бы что-то вроде этого:

LCD 
TV 
NEC 
HDTV 
etc. 

Что бы самый быстрый и эффективный метод сравнения текстового файла аббревиатуры с текстом текстового поля (каждый из которых может составлять 100 строк длинной строки) и исправление любого некапитализированного текста в текстовом поле? Есть идеи?

+0

Это вопрос только для того, чтобы сделать их все прописными буквами или есть коррекция орфографии? – AbZy

+0

Это будет просто сделать их UPPERCASE, относительно исходного списка. – Jeagr

+0

, так что если телевизор не в исходном списке, он должен оставаться неизменным? – AbZy

ответ

1
textBox.Lines = ReplaceWithAcronyms(textBox.Lines, File.ReadAllLines(acronymsPath)).ToArray(); 

private static IEnumerable<string> ReplaceWithAcronyms(IEnumerable<string> lines, IEnumerable<string> acronyms) 
{ 
    foreach (string line in lines) 
    { 
     yield return string.Join(" ", 
      line.Split(' ').Select(word => ReplaceWithAcronym(word, acronyms))); 
    } 
} 

private static string ReplaceWithAcronym(string word, IEnumerable<string> acronyms) 
{ 
    string acronym = acronyms.FirstOrDefault(ac => ac == word.ToUpperInvariant()); 
    if (acronym == null) 
    { 
     return word; 
    } 

    return acronym; 
} 

ReplaceWithAcronyms принимает строки текстового поля и строки файла, где каждая строка одна аббревиатура. Затем он разбивает каждую строку на слова и передает каждое слово в ReplaceWithAcronym. Если это слово является одним из аббревиатур, оно вернёт, что в противном случае оно вернет слово без изменений. Слова «unsplitted» с помощью string.Join. Результат преобразуется в массив, а затем возвращается обратно в строки текстовых полей.

Я не проверял, насколько быстро это происходит сотнями линий. Чтобы повысить производительность, вы можете использовать HashSet для аббревиатур. Я не думаю, что несколько сотен строк действительно проблема. Прежде чем пытаться улучшить производительность, я бы попробовал. Может быть, это уже достаточно хорошо.

+1

Я бы предложил использовать [StringComparison.OrdinalIgnoreCase] ​​(http://msdn.microsoft. com/en-us/library/system.stringcomparison.aspx). 'string.Compare (string1, string2, StringComparison.OrdinalIgnoreCase);' –

+0

Боб, почему бы вам это выбрать и куда бы он пошел? – Jeagr

+0

Он отлично работал, Песколино. Спасибо. – Jeagr

0

Это то, что я использовал, чтобы наконец заставить его работать. Я использовал решение от Песколино, а затем назвал его:

sortBox1 = ReplaceWithAcronyms(sortBox1, File.ReadAllLines(@"I:\acronyms.txt")).ToList(); 
Смежные вопросы