DataGrid Issue - значение всегда показывает 0? - PullRequest
0 голосов
/ 14 января 2011

У меня есть пара функций, которые, как я знаю, работают правильно.Один просто подсчитывает количество слов в текстовом поле с помощью регулярного выражения, а другой также использует регулярное выражение для подсчета экземпляров определенного слова (строки) в том же текстовом поле.Я убедился, что они оба возвращают ожидаемые значения.

Тем не менее, я явно испорчу функцию, чтобы как-то заполнить мою сетку данных, потому что ключевое слово всегда возвращает ноль, как и плотность.

Вот мой код:

public List<KeywordDensity> LoadCollectionData()
{
   string thearticle = txtArticle.Text;
   string[] keywordsarray = txtKeywords.Text.Split('\n');

   bool isincluded = false;
   int keywordcount = 0;
   int thedensity = 0;

   List<KeywordDensity> lsikeywords = new List<KeywordDensity>();
   foreach (string s in keywordsarray)
   {
      if (s.Trim() != "")
      {
         keywordcount = KeywordCount(thearticle, s);
         thedensity = keywordcount / WordCount(thearticle);

         if (thearticle.Contains(s))
         {
            isincluded = true;
         }
         else
         {
            isincluded = false;
         }

         lsikeywords.Add(new KeywordDensity()
         {
            included = isincluded,    
            keyword = s,
            occurences = keywordcount.ToString(),
            density = thedensity.ToString()
         });
      }
   }
   return lsikeywords;
}

РЕДАКТИРОВАТЬ @ 8:30 MST : выяснил часть проблемы.Использование "\ n" в качестве символа разделения не работало.Очевидно, это было просто «разделение» всего этого на один массивный кусок, который включал возврат каретки и отправлял это.Я изменил его на "\ r", и теперь, по крайней мере, части "Включено" и "Вхождения" работают нормально.

Теперь единственная проблема, с которой я столкнулся, это то, что "плотность" не работает.Я понимаю, что это не может быть объявлено как int;но он все равно всегда возвращает 0 - даже когда я объявляю плотность как float или var.

Есть ли что-то не так со следующим?

thedensity = keywordcount / wordcount;

Также - выполняет функцию .ToString ()усечь десятичную точку плюс все, что за ней?Например, если значение переменной равно 0,43, оно будет просто преобразовано в 0?Если это не так, какой тип переменной я должен использовать?Я думаю, что поплавок будет уместным.

Еще раз спасибо!

EDIT @ 8:45 MST : Жаль, что я не могу принять несколько ответов.Типы '\ r' и var были проблемными.Я не понял, что вы не можете вычислить число с плавающей точкой, разделив два целых числа.Когда я изменил исходные переменные на числа с плавающей запятой, а также на то, что плотность изменялась, это работало.

Двойное спасибо!

-Sootah

Ответы [ 4 ]

1 голос
/ 14 января 2011

Я бы изменил несколько вещей здесь. Сначала нужно переназначить ключевое слово, чтобы убедиться, что к нему не приложены пробелы:

foreach (string s in keywordsarray)
{
   string key_word = s.Trim();
   if (key_word != "")
   {
      // Replace all uses of s with key_word
      if(thearticle.Contains(key_word))
      // ...

Второй будет напрямую назначать isincluded:

isincluded = thearticle.Contains(key_word);

Тогда я бы просто убедился, что txtKeywords на самом деле является списком, разделенным символами новой строки:

// Is this really strings separated by newlines?
string[] keywordsarray = txtKeywords.Text.Split('\n');
1 голос
/ 14 января 2011

Да, у SwDevMan81 есть хорошее замечание - убедитесь, что в ключевом слове [] есть несколько слов.

Я почти уверен, что если пользователь вводит текст в поле Silverlight, разделителем будет '\ r' (по крайней мере, я знаю, что видел, что он так себя ведет).

Может быть лучше использовать регулярное выражение для разбиения.

1 голос
/ 14 января 2011

Вы рассчитываете с целыми числами.WordCount звучит для меня как большое число, ключевое слово нет.Может быть, поэтому у вас нет ожидаемого результата?

Еще один вопрос, что если WordCount вернет ноль?Это бросит исключение.Это никогда не случается (предположим, нет, но так ли это?)?Если исключение будет брошено в привязку, приложение не будет зависать, но результат будет ложным.

0 голосов
/ 14 января 2011

Ключ лежит в том, где вы заполняете эти данные? Вызов LoadCollectionData должен быть в конструкторе вашего кода, потому что вы используете List, в противном случае используйте ObservableCollection. Кроме того, размещение XAML таблицы также поможет.

...