2013-11-29 2 views
0

Моя цель - создать веб-сервис, который преобразует ввод пользователей (так что всего два текстовых поля и кнопка). У меня есть словарь как CSV-файл с двумя столбцами, разделенными точкой с запятой (первое - это слово, которое вводит пользователь, а второе - перевод). Im очень новой для C# и Ive вытащил код вместе, но оно не принимает один входной сигнал его принимать целый списокИспользование Streamreader для перевода переводчика

[Empty] 

EDIT для ясности

Я пытаюсь сделать так, чтобы пользователь может ввести работа они хотят перевести, нажмите на кнопку, то перевод этого слова обнаруживается

вход = текстовое поле Output = текстовое поле

ответ

-1

вам нужно прочитать файл в памяти, возможно, и затем искать сбор/массив для го e значение введенного пользователя.

здесь очень простой пример:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(); 
.. 
.. 

// some function called at startup to read the entire file in the collection 
private void LoadData() 
{ 
    var reader = new StreamReader(File.OpenRead(@"C:\dictionary.csv")); 
    while (!reader.EndOfStream) 
    { 
     var line = reader.ReadLine(); 
     var values = line.Split(';'); 
     var kvp = new KeyValuePair<string, string>(values[0], values[1]); 
     items.Add(kvp); 
    } 

} 


private string SearchWord(string inputWord) 
{ 
    string returnValue = string.Empty; 
    foreach(var currentItem in items) 
    { 
     if (string.Equals(inputWord, currentItem, StringComparison.OrdinalIgnoreCase)) 
     { 
     returnValue = currentItem.Value; 
     break; 
     } 
    } 

    return returnValue; 
} 

Что он делает? Итак, мы держим глобальную коллекцию элементов в списке. Каждый элемент в списке содержит ключ и связанное с ним значение. ключ - это слово для перевода FROM, а значение - переведенное слово.

Когда приложение запускается, например, вы вызываете LoadData() для загрузки файла в коллекцию.

Когда пользователь нажимает кнопку, вы вызываете «SearchResult», передавая ему входное значение из текстового поля. Затем он будет выполнять итерацию по коллекции, чтобы найти входное значение, и если он найдет его, он вернет переведенное слово обратно вам, поэтому вы берете это значение и, например, устанавливаете его в другое текстовое поле.

еще раз, очень простой и простой.

Я не занимался Словарем, но это лучше, потому что я недостаточно хорошо знаю ваши требования. Но если вы уверены, что нет повторяющихся слов (ключей), вы должны использовать словарь вместо List> like, который я сделал.

+0

Ухм, вы знаете, словарь для этого несколько лучше? Зачем нужен список KeyValuePair <> '? –

+0

@ Moo-Juice - я объяснил, почему приятель :) –

+0

Если есть повторяющиеся слова (дублирующиеся входные слова), у вас нет способа узнать, что правильно. Ваш код просто берет первый, но если есть дубликаты, то остальные все равно игнорируются. –

2

Во-первых, было бы лучше загрузить словарь один раз и сохранить его в более подходящей коллекции, например Dictionary<K, V>, где вход является ключом, а выходным значением является значение.

Конфиденциальный элемент формы:

private Dictionary<string, string> _dictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); // let's ignore case when comparing. 

Загрузить словарь один раз и только в вашем случае загрузки формы:

using(var reader = new StreamReader(File.OpenRead(@"C:/dictionary.csv"))) 
{ 
    while(!reader.EndOfStream) 
    { 
     string[] tokens = reader.ReadLine().Split(';'); 
     _dictionary[tokens[0]] = tokens[1]; 
    } 
} 

Переводя слово теперь так же просто, как:

public string Translate(string input) 
{ 
    string output; 
    if(_dictionary.TryGetValue(input, out output)) 
     return output; 

    // Obviously you might not want to throw an exception in this basis example, 
    // you might just go return "ERROR". Up to you, but those requirements are 
    // beyond the scope of the question! :) 
    throw new Exception("Sinatra doesn't know this ditty"); 
} 
+0

Хорошее решение, но никогда не контролирует поток, бросая исключение. это плохая практика. вместо этого, верните bool в Tuple, возможно, или пользовательский объект Response, который содержит результат Success и value или в этом случае, возможно, покажет MessageBox, что он не найден (если это приложение winforms) –

+2

Кто сказал, что я контролирую поток с использованием исключения? Возможно, в этом случае, если он не найден, необходимо исключение. Возможно, это не так, и он может вернуть пустую строку. И я не считаю, что это поток, это простой пример. –

+0

@Ahmedilyas: Все, что вы заявляете, является ужасным советом для приложения C#. Моя единственная жалоба заключается в том, что @ Moo-Juice может использовать «TryGetValue» и избегать двойного поиска. –

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