Проблема DataGrid - значение всегда показывает 0?

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

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

Вот мой код:

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;
}

EDIT @ 8:30 MST: проблема частично решена. Использование «\n» в качестве разделительного символа не работало. По-видимому, это было просто «разделение» всего на один массивный кусок, который включал возврат каретки и отправку этого. Я изменил его на «\ r», и теперь, по крайней мере, часть «Включено» и «Вхождения» работает нормально.

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

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

thedensity = keywordcount / wordcount;

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

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

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

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

-Сута


person Sootah    schedule 14.01.2011    source источник
comment
Я предполагаю, что тип данных, привязанный к элементам в DataGrid, — это KeywordDensity. Поскольку вы уверяете нас, что KeywordCount работает правильно, очень жаль, что вы не показали нам ни код для KeywordDensity, ни Xaml для DataGrid.   -  person AnthonyWJones    schedule 14.01.2011


Ответы (4)


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

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

person HCL    schedule 14.01.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');
person SwDevMan81    schedule 14.01.2011

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

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

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

person RobSiklos    schedule 14.01.2011

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

person Yogesh    schedule 14.01.2011