2009-06-11 16 views
1

Ich habe RichtextBox-Steuerelement in Form und eine Textdatei. Ich erhalte Textdatei zum Array und bekomme richtextbox1.text zu einem anderen Array, als vergleiche es und zähle Wörter, die übereinstimmen. Aber zum Beispiel gibt es zwei "Name" Wort in Textdatei und drei "und" Wort in Richtextbox .. Wenn es also zwei gleiche Wort in der Textdatei in Richtextbox kann es 3 oder höher nach 2 sein, muss es falsches Wort sein also darf es nicht gezählt werden. HashSet zählt jedoch eindeutige Werte, die nicht nach Duplikaten in einer Textdatei suchen. Ich möchte jedes Wort in Textdatei mit Wörtern in RichTextBox vergleichen .. (Sorr für mein Englisch.)HashSet IntersectWith Anzahl Wörter aber nur einmalig

Meine Codes hier;

 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()); 
+1

Sorry, das verstehe ich wirklich nicht. Es wäre viel einfacher zu verstehen mit mehreren klar geschriebenen Beispielen: "Textdatei: XYZ. Rich-Text-Box: ABC. Gewünschtes Ergebnis: BCX" oder was auch immer. –

Antwort

1

schließen, dass Sie wollen:

Datei:

foo 
foo 
foo 
bar 

Textfeld:

foo 
foo 
bar 
bar 

in 'führen 3 '(2 foos und ein 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()); 

Beachten Sie, dass dies das Lesewörterbuch destruktiv ändert, Sie können dies vermeiden (also nur einmal das Wörterbuch lesen), einfach das Rich-Text-Feld auf die gleiche Weise zählen und dann die Min der einzelnen Zählungen und summieren sie .

+0

Ah das ist das gleiche wie Marc Lösung, Seite aktualisieren für den Sieg – ShuggyCoUk

+0

Danke Mann das ist was ich will .. –

1

Sie brauchen die Zählungen, um gleich zu sein? Sie müssen die Wörter zählen, dann ...

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); 
     } 
Verwandte Themen