C# 字典重新添加单词作为新关键字,而不是增加值

C# 字典重新添加单词作为新关键字,而不是增加值,c#,dictionary,C#,Dictionary,我正在编写一个程序,在文本中查找每个唯一的单词,并将其打印到文本框中。我通过在字典中打印每个关键字来实现这一点,但是我的字典将每个单词作为单独的关键字添加,而不是忽略已经存在的单词 该函数被正确调用,它确实可以工作,但是simpy会打印我交给它的整个文本 编辑:我从文本文件中读取字符串,然后将其发送到函数。 这是输入字符串和输出: 输出: 生存与否,是心灵是否更高尚的问题 狂暴命运的投石器和箭,或者拿起武器对抗大海 烦恼和烦恼都会随着它们的结束而消失,睡眠不再意味着我们的结束 肉体继承人的心痛万

我正在编写一个程序,在文本中查找每个唯一的单词,并将其打印到文本框中。我通过在字典中打印每个关键字来实现这一点,但是我的字典将每个单词作为单独的关键字添加,而不是忽略已经存在的单词

该函数被正确调用,它确实可以工作,但是simpy会打印我交给它的整个文本

编辑:我从文本文件中读取字符串,然后将其发送到函数。 这是输入字符串和输出:

输出

生存与否,是心灵是否更高尚的问题 狂暴命运的投石器和箭,或者拿起武器对抗大海 烦恼和烦恼都会随着它们的结束而消失,睡眠不再意味着我们的结束 肉体继承人的心痛万分自然的震撼是完美的

公共字符串FindUniqueWords(字符串文本)
{
字典=新字典();
字符串uniqueWord=“”;
text=text.Replace(“,”,“”);//只是清理一下
text=text.Replace(“.”,“”);//只是稍微整理一下
string[]arr=text.Split(“”);//创建一个单词数组
foreach(arr中的字符串单词)//让我们在单词上循环
{
if(dictionary.ContainsKey(word))//如果它在字典中
dictionary[word]=dictionary[word]+1;//递增计数
其他的
dictionary[word]=1;//将其放入字典中,计数为1
}
foreach(dictionary中的KeyValuePair)//在字典中循环
{
uniqueWord+=(pair.Key+“”);
}
uniqueWords.Text=uniqueWord;
返回(“”);
}
一个简短的方法:(不要忘记使用System.Linq)


您的代码按预期工作(尽管忽略了大小写)。几乎可以肯定,问题在于在应用程序中显示结果,或者如何调用
FindUniqueWords
方法(而不是一次调用完整的文本)

另外,这里需要注意的是:默认情况下,
字典
不能多次包含单个键。这首先会破坏这本词典的全部目的。只有当您在某个地方覆盖了
相等
比较时才有可能,而您没有这样做

如果我使用以下输入尝试您的代码:

生存与否是个问题

输出变为:

生存还是毁灭,这是个问题


它的工作原理与预期的一样。

您正在使用
System.IO.File.ReadAllText
读取文本,因此
text
也可能包含换行符

arr=text.Split(“”)替换为
arr=text.Split(“”,'\r','\n')
或添加另一个替换:
text=text.Replace(Environment.NewLine,“”)


当然,通过查看调试器中的
arr
,您可以自己发现。

不是LINQ和Distinct()更简单的方法吗?代码看起来不错。您是否将调试器与一个非常简单的EAX示例(如“一二三”)一起使用?添加输入字符串示例和结果以使其更清晰检查原始键中的空格/换行符/转义符并将其重新发布在此处。嗯,LINQ的
Distinct()
是一种更好的方法(虽然您可能希望使用
StringSplitOptions.RemoveEmptyEntries
)。但是为了将来的参考:您应该研究dictionary对象上的
TryGetValue()
方法(比两次进行键/值查找更有效),以及学习对循环中发生的任何字符串连接使用
StringBuilder
(特别是在数据可能很长的情况下)。我对您的代码有完全相同的问题。我使用的是System.Linq()这个例子没有区分小写和大写-这是你的问题-你能提供一个样本InputExt吗?我已经检查过了,这不是问题,再次检查我的问题以查看我使用的输入。你如何处理文本框的赋值?你只需返回“”在你的示例中,我也看不出你把单词分配给了一个文本框,这个文本框是谁投了反对票,为什么投反对票?第一句话是这个答案中唯一重要的一点。@Rawling是真的,但是在没有提供证据的情况下做出这样的陈述?我宁愿不把它称为答案,这样的陈述更适合于对问题本身的评论您的示例比问题更有效的唯一原因是您添加了“是”“不是”。原始代码的问题不在于它如何显示或返回结果-它是不可靠的,但它没有错,您更改它并没有解决大小写问题。@pyroculus这就是我获取文本并调用代码字符串text=System.IO.File.ReadAllText(路径名)的方式;FindUniqueWords(text);我认为存在错误,因为当我使用字符串时,我只是像您那样在代码中编写,它工作得很好
public string FindUniqueWords(string text)
{
    Dictionary<string, int> dictionary = new Dictionary<string, int>();

    string uniqueWord = "";
    text = text.Replace(",", ""); //Just cleaning up a bit
    text = text.Replace(".", ""); //Just cleaning up a bit
    string[] arr = text.Split(' '); //Create an array of words

    foreach (string word in arr) //let's loop over the words
    {
        if (dictionary.ContainsKey(word)) //if it's in the dictionary
            dictionary[word] = dictionary[word] + 1; //Increment the count
        else
            dictionary[word] = 1; //put it in the dictionary with a count 1
    }

    foreach (KeyValuePair<string, int> pair in dictionary) //loop through the dictionary
    {
        uniqueWord += (pair.Key + " ");
    }
    uniqueWords.Text = uniqueWord;
    return ("");
}
    string strInput = "TEST TEST Text 123";
    var words = strInput.Split().Distinct();                
    foreach (var word in words )
    {
        Console.WriteLine(word);
    }