HashSetのIntersectWithは単語を数えるだけのユニークな
質問
私は、フォームやテキストファイルにRichTextBoxコントロールを得ました。私は配列にテキストファイルを取得し、それを比較し、一致する単語を数えるよりも、他のアレイにrichtextbox1.text取得しています。 しかし、例えばテキストファイル内の2つの同じ単語がリッチテキストボックスに存在する場合、それは2から3以上であることカントので、それはそう間違っている単語でなければなりません。..リッチテキストボックスに2つの「名前」テキストファイル内の単語と3「と」言葉がありますそれはカウントされない必要があります。しかし、HashSetのはテキストのみのファイルで重複を探していない一意の値をカウントしています。私は、リッチテキストボックス内の単語をテキストファイル内のすべての単語を比較したい...(私の英語のための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());
解決
あなたがしたいことを推測ます:
ファイル:
foo
foo
foo
bar
テキストボックス:
foo
foo
bar
bar
をもたらすために '3'(2つのFOOS及び1バール)
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());
これは破壊的に読み取り辞書を変更している、あなたは、単に同じようにリッチテキストボックスをカウントして、個々のカウントの分を取って、それらを合計購入(その一度だけ辞書を読まなければならない)、これを避けることができることに注意してくださいます。
他のヒント
あなたは数が同じである必要がありますか?あなたは、単語をカウントする必要がある、そして...
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);
}
所属していません StackOverflow