字符串未正确拆分

时间:2012-11-09 03:24:28

标签: c# arrays string dictionary split

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

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

    }

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

2 个答案:

答案 0 :(得分:6)

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

var words = newFileText.Split(delimiterChars,
   StringSplitOptions.RemoveEmptyEntries);

答案 1 :(得分: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());

这就是你需要的一切。

祝你好运!