2011-01-14 69 views
0

我有几个函数,我知道正确工作。一个用正则表达式计算文本框中单词的数量,另一个用正则表达式计算同一文本框中特定单词(字符串)的实例。我确信这些都会返回预期的值。DataGrid问题 - 值总是显示0?

但是,我显然搞砸了函数来以某种方式填充我的datagrid,因为keywordcount总是返回为零,密度也是如此。

这里是我的代码:

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 AM MST:想通了这个问题的一部分。使用“\ n”作为分隔符不起作用。显然,它只是将整个事件“分裂”成一个大块,包括回车和提交。我将它改为“\ r”,现在至少“Included”和“Occurences”部分工作正常。

现在唯一的问题是,“密度”不起作用。我意识到它不能被声明为int;但它仍然总是返回0 - 即使我将这个密度声明为float或var。

以下是否有问题?

thedensity = keywordcount/wordcount; 

此外 - .ToString()函数截断小数点加上所有的东西过去吗?例如,如果一个变量的值是0.43,它只会转换为0?如果情况并非如此,我应该使用哪种变量类型?我会认为浮动是适当的。

再次感谢!

EDIT @ 8:45 MST:太糟糕了,我不能接受多个答案。 '\ r'和var类型都是问题。我没有意识到你不能通过除以两个整数来计算浮点数。当我将源变量更改为浮点以及密度变量时,它也起作用。

双谢!

-Sootah

+0

我假设数据类型被绑定为DataGrid中的项目是KeywordDensity。既然你向我们保证KeywordCount正在正常工作,那么你就没有向我们展示`KeywordDensity`的代码或者DataGrid的Xaml。 – AnthonyWJones 2011-01-14 12:23:44

回答

1

你正在用整数计算。 WordCount对我来说听起来是一个很大的数字,不是关键字count。也许这就是为什么你没有期望的结果?

另一个问题,如果WordCount返回零?这会引发异常。这是否会发生(假设不是,但是这样做?)?如果异常将被绑定,应用程序将不会挂起,但结果将是错误的。

1

我会在这里改变一些东西。首先是重新分配的关键字,以确保没有连接到它的空间:

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

是,SwDevMan81好点 - 确保keywordsarray []实际上有一些单词。

我敢肯定,如果用户输入一个Silverlight文本框,分隔符是'\ r'(至少我知道我已经看到它的行为方式)。

可能更好地使用正则表达式来分割。

0

关键在于你在哪里填写这些数据? LoadCollectionData的调用应该在您的代码的构造函数中,因为您使用的是List,否则使用ObservableCollection。此外,张贴网格的XAML也将有所帮助。