我正在尝试将一个字符串拆分成一个字符串[],该字符串由最初使用该代码保存的字符串构成。
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]++;
}
}
澄清我遇到的问题是,即使字符串末尾的单词是重复的,它仍然被视为一个新单词,因此被视为一个新字符串。
答案 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());
这就是你需要的一切。
祝你好运!