2011-03-12 5 views
0

Je dois écrire une fonction qui retourne tous les caractères qui apparaissent 2 fois ou plus dans le texte. Il n'y a pas de problème quand je l'utilise sans fonction (par exemple sur un clic de bouton). Voilà comment je le fais:C#. Comment retourner un caractère?

for (int i = 0; i < alph.Length; i++) // alph is my text(string) 
     { 
      int count = allText.Split(alphCh[i]).Length - 1; 
      if (count >= 2)     
       listView2.Items.Add(alphCh[i].ToString());     
     } 

Voilà comment j'écris la fonction:

public char[] chars2(string text) 
    { 
     char[] allChar = text.ToCharArray(); 
     string allText = text.ToString(); 
     string allTextL = text.ToLower(); 
     string alph = "abcdefghijklmnopqrstuvwxyz"; 
     char[] alphCh = alph.ToCharArray(); 
     char[] result = new char[0]; 
     int allcount = 0; 

     for (int i = 0; i < alph.Length; i++) 
     { 
      int count = allText.Split(alphCh[i]).Length - 1; 
      if (count >= 2) 
      { 
       allcount++; 
       result = new char[allcount]; 
       for (int j = 0; j < allcount; j++) 
       { 
        result[j] = alphCh[i]; 
        return result; 
       } 
      }    
     } 
     return result;    
    } 

Mais la fonction retourne tout premier caractère qui se produit 2 fois ou plus dans le texte. Par exemple j'écris abcbca - func renvoie a, et je veux func retourne a, b, c, pour l'écrire dans ListView par exemple. Qu'est-ce que je fais de mal? S'il te plaît, j'ai tellement besoin de ton aide. Merci.

+1

Le retour dans la boucle arrête la boucle. –

+0

Non, cela peut se produire 2 fois ou plus n'importe où dans le texte: abcdabcd, retourne aussi a, b, c, d. – Daria

+0

Yochai Timmer, merci, mais que faire? J'ai essayé d'écrire continue mais ce n'est pas utile. – Daria

Répondre

4

Si vous avez C# 3.0 ou plus récent, vous pouvez utiliser LINQ:

char[] result = text 
    .GroupBy(x => x) 
    .Where(g => g.Count() > 1) 
    .Select(g => g.Key) 
    .ToArray(); 
+0

Merci beaucoup! Ça marche! Mais une question: puis-je rechercher seulement le caractère latin (seulement les caractères de l'alphabet anglais)? Merci. – Daria

1

Renvoyer une liste à la place, et l'utiliser dans la fonction comme vous le faites avec le listview; il suffit d'utiliser List<char> rVal = new List<char>(); puis rVal.Add(character) si ce ne est pas déjà ajouté

Retirez également le retour dans la boucle:

+0

Merci, j'ai enlevé. J'ai eu cette pensée mais y a-t-il un moyen plus facile de le faire? – Daria

0

Le premier return result; retournera directement quand il a trouvé le premier résultat.

+0

Merci, et qu'est-ce que ça veut dire? – Daria

2

Linq peut simplifier. Est-ce que cela répond aux exigences?

"aabbccpoiu".ToCharArray() 
    .GroupBy(c => c) 
    .Where(g => g.Count() > 1) 
    .Select(g => g.Key) 

Il retourne a, b et c.

+1

Vous n'avez pas besoin d'appeler 'ToCharArray'. La classe 'string' implémente' IEnumerable ', malgré Intellisense montrant que la classe' string' n'a pas de méthode d'extension GroupBy (c'est le cas). –

+0

Ok, merci, c'était une nouvelle pour moi. Fun comment le reste du code était identique. – Grastveit

+0

Merci, Grastveit. – Daria

1

Juste une suggestion =

public List<char> getMoreThanTwice(string text) { 

char[] characters = text.toCharArray(); 
Dictionary<char, int> chars = new Dictionary<char, int>(); 
List<char> morethantwice = new List<char>(); 

for (int i=0;i<characters.Length;i++) { 
    if (chars.containsKey(characters[i])) { 
    chars[characters[i]] = chars[characters[i]] + 1; 
    }else{ 
    chars.Add(characters[i], 1); 
    } 
} 

foreach (KeyValuePair keypair in chars) { 
    if (keypair.Value >= 2) { 
    morethantwice.Add(keypair.Key); 
    } 
} 

return morethantwice; 
} 
+0

merci, je vais marquer ça. – Daria

Questions connexes