这是一个读取CSV文件的程序,将值添加到字典类中,然后分析文本框中的字符串以查看是否有任何单词与字典条目匹配。它将缩写(LOL,ROFL等)替换为真实的单词。它通过将输入的文本分成单个单词来匹配字符串。
public void btnanalyze_Click(object sender, EventArgs e)
{
var abbrev = new Dictionary<string, string>();
using (StreamReader reader = new StreamReader("C:/Users/Jordan Moffat/Desktop/coursework/textwords0.csv"))
{
string line;
string[] row;
while ((line = reader.ReadLine()) != null)
{
row = line.Split(',');
abbrev.Add(row[0], row[1]);
Console.WriteLine(abbrev);
}
}
string twitterinput;
twitterinput = "";
// string output;
twitterinput = txtInput.Text;
{
char[] delimiterChars = { ' ', ',', '.', ':', '\t' };
string text = twitterinput;
string[] words = twitterinput.Split(delimiterChars);
string merge;
foreach (string s in words)
{
if (abbrev.ContainsKey(s))
{
string value = abbrev[s];
merge = string.Join(" ", value);
}
if (!abbrev.ContainsKey(s))
{
string not = s;
merge = string.Join(" ", not);
}
;
MessageBox.Show(merge);
}
到目前为止,问题是最终字符串被输出到文本框中,但只在覆盖时打印最后一个字。这是一项大学任务,所以我正在寻找正确的方向,而不是实际的答案。非常感谢!
答案 0 :(得分:2)
string.Join()
获取字符串集合,将它们连接在一起并返回结果。但在您的情况下,该集合只包含一个项目:value
或not
。
要使代码正常工作,您可以使用以下内容:
merge = string.Join(" ", merge, value);
但由于字符串的工作方式,这将非常慢,因此您应该使用StringBuilder
。
答案 1 :(得分:0)
这是问题所在:
string not = s;
merge = string.Join(" ", not);
您只是使用空格分隔符加入单个元素(最新的),从而覆盖您之前放入merge
的内容。
如果你想坚持使用字符串,你需要使用Concat
将新单词附加到输出中,尽管每次重新创建字符串时这都会很慢。使用StringBuilder
创建输出会更有效。
如果您的作业要求使用Join
来构建输出,那么当您遍历它们时,您需要替换words
数组中的目标词。但是,为此,您需要使用除foreach
之外的其他一些循环机制,因为这不会让您修改正在循环的数组。
答案 2 :(得分:0)
出于此目的,用户StringBuilder
类更好
http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx