1

フォームとテキスト ファイルで richtextBox コントロールを取得しました。テキストファイルを配列に取得richtextbox1.textし、それを比較して一致する単語をカウントするよりも他の配列に取得しています。

しかし、たとえば、テキスト ファイルには 2 つの "name" 単語があり、richtextbox には 3 つの "and" 単語があります。したがって、richtextbox のテキスト ファイルに同じ単語が 2 つある場合、2 の後に 3 つ以上になることはありません。それは間違った単語である必要があるため、カウントされません。しかし、HashSet は一意の値をカウントしているだけで、テキスト ファイル内の重複を探していません。テキスト ファイル内のすべての単語を RichTextBox 内の単語と比較したいと考えています。

私のコードはここにあります:

        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());
4

2 に答える 2

1

あなたが欲しいと推測する:

ファイル:

foo
foo
foo
bar

テキストボックス:

foo
foo
bar
bar

'3' (2 つの foo と 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());

これは読み取り辞書を破壊的に変更していることに注意してください。これを回避できます (したがって、辞書を 1 回だけ読み取る必要があります)。単純にリッチ テキスト ボックスを同じ方法でカウントし、個々のカウントの最小値を取得してそれらを合計します。

于 2009-06-11T10:04:20.343 に答える
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);
        }
于 2009-06-11T09:15:27.307 に答える