我在表单和文本文件中获得了richtextBox控件。我得到文本文件到数组并获得richtextbox1.text到其他数组,而不是比较它和计数匹配的单词。 但是例如文本文件中有两个“名字”字,富文本框中有三个“和”字。所以如果富文本框中的文本文件中有两个相同的单词,那么在2之后它不能是3或更高,所以它必须是错误的单词所以它不能被计算在内。但是HashSet只计算唯一值,而不是在文本文件中查找重复项。我想将文本文件中的每个单词与RichTextBox中的单词进行比较..(我的英语为sorr。)
我的代码在这里;
StreamReader sr = new StreamReader("c:\\test.txt",Encoding.Default);
string[] word = sr.ReadLine().ToLower().Split(' ');
sr.Close();
string[] word2 = richTextBox1.Text.ToLower().Split(' ');
var set1 = new HashSet<string>(word);
var set2 = new HashSet<string>(word2);
set1.IntersectWith(set2);
MessageBox.Show(set1.Count.ToString());
答案 0 :(得分:1)
您需要的计数是一样的吗?你需要计算单词,然后......
static Dictionary<string, int> CountWords(string[] words) {
// use (StringComparer.{your choice}) for case-insensitive
var result = new Dictionary<string, int>();
foreach (string word in words) {
int count;
if (result.TryGetValue(word, out count)) {
result[word] = count + 1;
} else {
result.Add(word, 1);
}
}
return result;
}
...
var set1 = CountWords(word);
var set2 = CountWords(word2);
var matches = from val in set1
where set2.ContainsKey(val.Key)
&& set2[val.Key] == val.Value
select val.Key;
foreach (string match in matches)
{
Console.WriteLine(match);
}
答案 1 :(得分:1)
推断你想要:
文件:
foo
foo
foo
bar
文本框:
foo
foo
bar
bar
导致'3'(2 foos和1 bar)
Dictionary<string,int> fileCounts = new Dictionary<string, int>();
using (var sr = new StreamReader("c:\\test.txt",Encoding.Default))
{
foreach (var word in sr.ReadLine().ToLower().Split(' '))
{
int c = 0;
if (fileCounts.TryGetValue(word, out c))
{
fileCounts[word] = c + 1;
}
else
{
fileCounts.Add(word, 1);
}
}
}
int total = 0;
foreach (var word in richTextBox1.Text.ToLower().Split(' '))
{
int c = 0;
if (fileCounts.TryGetValue(word, out c))
{
total++;
if (c - 1 > 0)
fileCounts[word] = c - 1;
else
fileCounts.Remove(word);
}
}
MessageBox.Show(total.ToString());
请注意,这会破坏性地修改读取字典,您可以避免这种情况(因此只需要阅读字典一次)购买只需以相同的方式计算富文本框,然后获取单个计数的最小值并将它们相加