3

我正在尝试将一个字符串拆分为一个字符串 [],该字符串由最初使用休闲代码保存的字符串组成。

    private string[] ConvertWordsFromFile(String NewFileText)
    {
        char[] delimiterChars = { ' ', ',', '.', ':', '/', '|', '<' , '>','/','@','#','$','%','^','&','*','"','(',')',';'};       
        string[] words = NewFileText.Split(delimiterChars);
        return words;


    }

然后我使用它来将单词添加到与单词键及其频率值保持同步的字典中。所有其他重复的单词都不会作为键添加,只有值会受到影响。然而,最后一个词被算作一个不同的词,因此被制成一个新的键。我怎样才能解决这个问题?

这是我在字典中添加单词的代码:

public void AddWord(String newWord)
    {
       newWord = newWord.ToLower();
        try
        {
            MyWords.Add(newWord, 1);
        }
        catch (ArgumentException)
        {
            MyWords[newWord]++;
        }

    }

为了澄清我遇到的问题,即使字符串末尾的单词是重复的,它仍然被视为一个新单词,因此是一个新字符串。

4

2 回答 2

6

随机猜测 - 最后的空格会产生您不期望的空词。如果是 - 为Split使用正确的选项:

var words = newFileText.Split(delimiterChars,
   StringSplitOptions.RemoveEmptyEntries);
于 2012-11-09T03:30:10.947 回答
2

拆分不是执行您想做的事情的最佳选择,因为您最终会遇到此类问题,并且您还必须指定所有分隔符等。

一个更好的选择是使用正则表达式而不是您的 ConvertWordsFromFile 方法,如下所示:

Regex.Split(theTextToBeSplitted, @"\W+")

此行将返回一个包含所有“单词”的数组。一旦你有了它,下一步应该是创建你的字典,所以,如果你可以在你的代码中使用 linq,那么最简单、更简洁的方法就是:

var theTextToBeSplitted = "#Hi, this is a 'little' test: <I hope it is useful>";
var myDictionary = Regex.Split(theTextToBeSplitted, @"\W+")
                        .GroupBy(x => x)
                        .ToDictionary(x => x.Key, x => x.Count());

这就是你所需要的。

祝你好运!

于 2012-11-09T04:21:17.983 回答