2013-07-15 4 views
0

Je souhaite supprimer les caractères qui correspondent entre les deux chaînes données. Par exemple.Suppression des caractères correspondants entre deux chaînes

string str1 = "Abbbccd"; 
string str2 = "Ebbd"; 

A partir de ces deux chaînes, je veux la sortie comme:

"Abcc", seuls les nombreux caractères correspondants doivent être enlevés de str1, qui sont présents dans str2.

J'ai essayé le code suivant:

public string Sub(string str1, string str2) 
    { 
     char[] arr1 = str1.ToCharArray(); 
     char[] arr2 = str2.ToCharArray(); 

     char[] arrDifference = arr1.Except(arr2).ToArray(); 
     string final = new string(arrDifference); 

     return final; 
    } 

Avec ce code, je reçois la sortie comme "Ac". Il supprime tous les caractères correspondants entre deux tableaux et stocke 'c' une seule fois.

Répondre

3

d'abord créer cette méthode d'assistance:

IEnumerable<Tuple<char, int>> IndexDistinct(IEnumerable<char> source) 
{ 
    var D = new Dictionary<char, int>(); 
    foreach (var c in source) 
    { 
     D[c] = D.ContainsKey(c) ? (D[c] + 1) : 0; 
     yield return Tuple.Create(c, D[c]); 
    } 
} 

Il convertit une chaîne de caractères "aabcccd" de [(a, 0), (a, 1), (b, 0), (c, 0), (c, 1), (c, 2), (d, 0)]. L'idée est de rendre chaque caractère distinct en ajoutant un index de comptage sur des caractères égaux.

ensuite modifier votre fonction proposée comme ceci:

string Sub(string str1, string str2) 
{ 
    return new string(
     IndexDistinct(str1) 
      .Except(IndexDistinct(str2)) 
      .Select(x => x.Item1) 
      .ToArray()); 
} 

Maintenant que vous faites sur ExceptTuple<char, int> au lieu de simplement char, vous devriez obtenir le comportement que vous avez spécifié.

+0

Merci beaucoup pour la réponse. Je vais essayer ça. – RahulD

+1

Excellent. Cela fonctionne parfaitement. Merci beaucoup. :) – RahulD

0

Utilisez les commandes de chaîne C# pour modifier la chaîne.

public string testmethod(string str1, string str2) 
    { 
     string result = str1; 
     foreach (char character in str2.ToCharArray()) 
     { 
      result = result.Replace(character.ToString(), ""); 
     } 

     return result; 
    } 
+0

Merci pour la contribution. J'ai essayé ce code, il résout mon problème et stocke 'c' deux fois comme prévu mais il supprime tous les 'b' et donne la sortie comme "Acc" au lieu de "Abcc". :) – RahulD

+0

Ah, les positions sont importantes. Eh bien, cela va changer la mise en œuvre. Désolé d'avoir manqué ce détail. Je vais le modifier. – Craig

3

Vous pouvez le faire aussi avec une liste:

List<char> one = new List<char>("Abbbccd".ToCharArray()); 
    List<char> two = new List<char>("Ebbd".ToCharArray()); 
    foreach (char c in two) { 
     try { one.RemoveAt(one.IndexOf(c)); } catch { } 
    } 
    string result = new string(one.ToArray()); 
+0

Merci beaucoup. Précis et fonctionnel. :) – RahulD

Questions connexes