2012-04-28 3 views
2

Это программа, которая читает в CSV-файле, добавляет значения в класс словаря и затем анализирует строку в текстовом поле, чтобы узнать, соответствует ли какое-либо из слов словарю. Он заменит аббревиатуры (LOL, ROFL и т. Д.) На их настоящие слова. Он соответствует строкам, разбивая введенный текст на отдельные слова.Строка Конкатенация/Перезапись?

public void btnanalyze_Click(object sender, EventArgs e) 
    { 
     var abbrev = new Dictionary<string, string>(); 
     using (StreamReader reader = new StreamReader("C:/Users/Jordan Moffat/Desktop/coursework/textwords0.csv")) 
     { 
      string line; 
      string[] row; 

      while ((line = reader.ReadLine()) != null) 
      { 
       row = line.Split(','); 

       abbrev.Add(row[0], row[1]); 
       Console.WriteLine(abbrev); 
      } 
     } 


     string twitterinput; 
     twitterinput = ""; 
     // string output; 
     twitterinput = txtInput.Text; 
     { 
      char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; 

      string text = twitterinput; 

      string[] words = twitterinput.Split(delimiterChars); 


     string merge; 
      foreach (string s in words) 
      { 
       if (abbrev.ContainsKey(s)) 
       { 
        string value = abbrev[s]; 


        merge = string.Join(" ", value); 
       } 

        if (!abbrev.ContainsKey(s)) 
        { 
         string not = s; 
         merge = string.Join(" ", not); 
        } 

         ; 
         MessageBox.Show(merge); 

       } 

Проблема до сих пор является то, что конечная строка выводится в текстовое поле, но печатает только последнее слово, как он переписывает. Это университетское задание, поэтому я ищу толчок в правильном направлении, а не фактический ответ. Большое спасибо!

+0

@ L.B, что бы не добавить пробелы в результате, хотя. – svick

+0

Я не знаю точно, но вы пробовали пройти через цикл с помощью отладчика? Я думаю, что все, прежде чем оно будет выглядеть правильно, поэтому петля, скорее всего, ваша проблема. – sebsebmc

ответ

0

Это проблема:

string not = s; 
merge = string.Join(" ", not); 

Вы просто присоединиться один элемент (последний) с космическим разделителем, таким образом переписывая то, что вы ранее введенным в merge.

Если вы хотите придерживаться строки, вам нужно использовать Concat, чтобы добавить новое слово на выход, хотя это будет медленным, поскольку вы каждый раз воссоздаете строку. Для создания результата будет более эффективным использование StringBuilder.

Если ваше назначение требует, чтобы вы использовали Join для создания выходных данных, тогда вам нужно будет заменить целевые слова в массиве words, когда вы будете перебирать их. Однако для этого вам понадобится использовать какой-либо другой механизм циклизации, чем foreach, так как это не позволяет вам изменять массив, который вы зацикливаете.

+0

На самом деле это не соединение пространства и 's', оно использует пространство в качестве разделителя. То, что вы описали, будет 'String.Concat()'. – svick

+0

@svick - Я знаю - это плохо сформулировано. Я исправил это. – ChrisF

2

string.Join() берет набор строк, объединяет их и возвращает результат. Но в вашем случае коллекция содержит только один элемент: value, или not.

Чтобы сделать код работы, вы могли бы использовать что-то вроде:

merge = string.Join(" ", merge, value); 

Но из-за того, как струны работать, это будет довольно медленно, так что вы должны использовать вместо StringBuilder.

+0

Медленный на данный момент прекрасен, поэтому я дам это, а затем попытаюсь создать код'StringBuilder'code ', как только у меня это получится. Ура! –

+0

Как и в случае с присоединением, я думаю, что это противоречило бы всей идее его назначения. –

+0

@JeffMercado, я не понимаю, почему это противоречит идее задания. – svick

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