2012-03-19 93 views
1

我想弄清楚如何在字符串中顯示重複的字母。例如,如果輸入的字符串是「紅屋」,它會顯示字母「e」被重複,然後它會顯示在我創建的標籤中。這是一個基本的程序,這是我迄今爲止寫的。任何幫助表示讚賞。C#顯示字符串中的重複字母

private void button1_Click(object sender, EventArgs e) 
    { 
     string enteredWord = textBox1.Text; 
     char letter; 


     for (int index = 0; index < enteredWord.Length; index++) 
     { 
      letter = enteredWord[index]; 

      if (letter == enteredWord[index]) 
      { 
       label1.Text = (letter.ToString()); 
      } 
      else 
      { return; 

      } 
+0

只是爲了好玩:(? [A-ZA-Z])。'* \ k ' – Ryan 2012-03-19 15:46:19

+0

@minitech - 那是什麼? – SkonJeet 2012-03-19 16:08:53

回答

0

可以建立一個HashSet並檢查每個字母。我敢肯定有一個更有效的方式,但是這應該工作:(未經測試)

string enteredWord = textBox1.Text; 
HashSet<char> letters = new HashSet<char>(); 
foreach(char c in enteredWord) 
{ 
    if (letters.Contains(c)) 
     label1.Text += c.ToString(); 
    else 
     letters.Add(c); 
} 

編輯:我想,如果他們出現3次以上,這將打印出字母的重複,但你的想法。

+0

謝謝你它的魅力。 – EASTON 2012-03-19 15:54:10

0

我會建議使用List並添加值,如果你還沒有遇到它,並更新文本框,如果你已經遇到它。對於未來的FYI,如果您需要知道確切的計數,則可以使用Dictionary

List<char> charactersThatHaveOccurred = new List<char>(); 
    string enteredWord = textBox1.Text; 
    foreach(var character in enteredWord) 
    { 
     if(charactersThatHaveOccurred.Contains(character)) 
      label1.Text += character ; 
     else 
      charactersThatHaveOccurred.Add(character); 
    } 
+0

林不熟悉字典,我不得不更詳細地看看。 – EASTON 2012-03-21 03:57:23

2

您也可以使用Linq爲:

 var query = from l in enteredWord 
        group l by l into g 
        where g.Count() > 1 
        select new { letter = g.Key, count = g.Count() }; 
     foreach (var item in query) 
     { 
      label1.Text += item.letter + " "; 
     } 
+0

感謝您的意見。我查看關於Linq的更多細節。 – EASTON 2012-03-21 03:58:31

0

,想到的第一件事是:

List<char> repeats = enteredWord.Where(c1 => enteredWord.Count(c2 => c1 == c2) > 1).Distinct().ToList(); 

,將返回所有的重複字符的List<char>。你可以抓住第一個,或者任何你想要的。

它在速度方面可能不是最佳的,但它很簡單。

0

請參閱其他答案以獲得解決此問題的更好方法,但我試圖瞭解您正在嘗試執行的操作。 (注意,下面的代碼是非常低效的,使用已經看到的字符的HashSet將是我的解決方案。)

也許你錯過了內循環?目前,您將一些東西(enteredword[index])分配到letter,然後立即比較它們。所以你要比較每個字母本身。

for (int index = 0; index < enteredWord.Length; index++) 
    { 
     letter = enteredWord[index]; 

     for (int index2 = 0; index < enteredWord.Length; index++) 
     { 
      if (index != index2 && letter == enteredWord[index2]) 
      { 
       label1.Text = (letter.ToString()); 
       return; 
      } 
     } 
    } 
1

這應該做你要找的內容:

public static Dictionary<char, int> Count(string input) 
    { 
     Dictionary<char, int> d = new Dictionary<char, int>(); 
     foreach (char c in input) 
     { 
      if (d.Keys.Contains(c)) 
       d[c]++; 
      else 
       d.Add(c, 1); 
     } 
     return d; 
    } 

    static void Main(string[] args) 
    { 
     Dictionary<char, int> d = Count("Red House"); 
     foreach (char c in d.Keys) 
     { 
      Console.WriteLine("{0}: {1}", c, d[c]); 
     } 
     Console.ReadKey(); 
    } 
+0

是啊,這個工作得很好,謝謝你的幫助。 – EASTON 2012-03-21 03:56:22

0
  string s = "red house"; 
      foreach (char c in s) 
      { 
       if (s.IndexOf(c) != s.LastIndexOf(c)) 
       { 
        label1.Text += c.ToString(); 
       } 
       s.Replace(c.ToString(), string.Empty); 
      }