web-dev-qa-db-fra.com

Moyen le plus rapide de supprimer les espaces blancs dans la chaîne

J'essaie d'extraire plusieurs adresses électroniques séparées par "," dans la chaîne de la table de base de données, mais cela me renvoie également des espaces, ce qui me permet de supprimer rapidement les espaces. 

Le code suivant supprime les espaces, mais il devient également lent chaque fois que j'essaie d'extraire un grand nombre d'adresses électroniques dans une chaîne telle que 30000, puis d'essayer de supprimer les espaces entre elles. Il faut plus de quatre à cinq minutes pour supprimer ces espaces. 

 Regex Spaces =
        new Regex(@"\s+", RegexOptions.Compiled);
txtEmailID.Text = MultipleSpaces.Replace(emailaddress),"");

Quelqu'un pourrait-il me dire, s'il vous plaît, comment puis-je supprimer les espaces en une seconde, même pour un grand nombre d'adresses électroniques?

24
Joe

Je construirais une méthode d'extension personnalisée en utilisant StringBuilder, comme:

public static string ExceptChars(this string str, IEnumerable<char> toExclude)
{
    StringBuilder sb = new StringBuilder(str.Length);
    for (int i = 0; i < str.Length; i++)
    {
        char c = str[i];
        if (!toExclude.Contains(c))
            sb.Append(c);
    }
    return sb.ToString();
}

Usage:

var str = s.ExceptChars(new[] { ' ', '\t', '\n', '\r' });

ou pour être encore plus rapide:

var str = s.ExceptChars(new HashSet<char>(new[] { ' ', '\t', '\n', '\r' }));

Avec la version hashset, une chaîne de 11 millions de caractères prend moins de 700 ms (et je suis en mode débogage)

MODIFIER :

Le code précédent est générique et permet d'exclure n'importe quel caractère, mais si vous souhaitez supprimer uniquement les blancs le plus rapidement possible, vous pouvez utiliser:

public static string ExceptBlanks(this string str)
{
    StringBuilder sb = new StringBuilder(str.Length);
    for (int i = 0; i < str.Length; i++)
    {
        char c = str[i];
        switch (c)
        {
            case '\r':
            case '\n':
            case '\t':
            case ' ':
                continue;
            default:
                sb.Append(c);
                break;
        }
    }
    return sb.ToString();
}

EDIT 2:

comme indiqué correctement dans les commentaires, la méthode correcte pour supprimer tout les espaces est d'utiliser la méthode char.IsWhiteSpace:

public static string ExceptBlanks(this string str)
{
    StringBuilder sb = new StringBuilder(str.Length);
    for (int i = 0; i < str.Length; i++)
    {
        char c = str[i];
        if(!char.IsWhiteSpace(c))
            sb.Append(c);
    }
    return sb.ToString();
}
44
digEmAll

Avec linq, vous pouvez le faire simplement:

emailaddress = new String(emailaddress
                                     .Where(x=>x!=' ' && x!='\r' && x!='\n')
                                     .ToArray());

Je ne l'ai pas comparé avec les approches stringbuilder, mais c'est beaucoup plus rapide que les approches basées sur des chaînes . il ne va pas utiliser une très grande mémoire et ne pas ralentir la vitesse (sauf un passage supplémentaire dans la chaîne au début).

5
Saeed Amiri
emailaddress.Replace("  ", string.empty);
4
Partha Bijjam

Vous devriez essayer String.Trim(). Il va couper tous les espaces du début à la fin d'une chaîne

Ou vous pouvez essayer cette méthode à partir d'un sujet lié: [lien]

    public static unsafe string StripTabsAndNewlines(string s)
    {
        int len = s.Length;
        char* newChars = stackalloc char[len];
        char* currentChar = newChars;

        for (int i = 0; i < len; ++i)
        {
            char c = s[i];
            switch (c)
            {
                case '\r':
                case '\n':
                case '\t':
                    continue;
                default:
                    *currentChar++ = c;
                    break;
            }
        }
        return new string(newChars, 0, (int)(currentChar - newChars));
    }
4
Evgeny Gavrin

Il y a beaucoup de façons différentes, certaines plus rapides que d'autres:

public static string StripTabsAndNewlines(this string str) {

    //string builder (fast)
    StringBuilder sb = new StringBuilder(str.Length);
    for (int i = 0; i < str.Length; i++) {
        if ( !  Char.IsWhiteSpace(s[i])) {
            sb.Append();
        }
    }
    return sb.tostring();

    //linq (faster ?)
    return new string(str.ToCharArray().Where(c => !Char.IsWhiteSpace(c)).ToArray());

    //regex (slow)
    return Regex.Replace(str, @"\s+", "")

}
2
katbyte

Veuillez utiliser la méthode TrimEnd() de la classe String. Vous pouvez trouver un bon exemple ici.

2
Dun
string str = "Hi!! this is a bunch of text with spaces";

MessageBox.Show(new String(str.Where(c => c != ' ').ToArray()));
1
Senagi

Vous devriez envisager de remplacer les espaces de l'ensemble des enregistrements dans votre procédure stockée ou votre requête à l'aide de la fonction REPLACE( ) si possible et de mieux corriger vos enregistrements de base de données puisqu'un espace dans une adresse électronique n'est de toute façon pas valide. 

Comme mentionné par d'autres, il vous faudrait décrire les différentes approches. Si vous utilisez Regex, vous devriez minimalement en faire une variable statique de niveau classe:

public static Regex MultipleSpaces = new Regex(@"\s+", RegexOptions.Compiled);

emailAddress.Where(x=>{ return x != ' ';}).ToString( ) est susceptible d'avoir une surcharge de fonction bien qu'il puisse être optimisé en ligne par Microsoft - là encore, le profilage vous donnera la réponse.

La méthode la plus efficace consisterait à allouer un tampon, à copier caractère par caractère dans un nouveau tampon et à ignorer les espaces. C # prend en charge les pointeurs de sorte que vous pouvez utiliser du code non sécurisé, allouer un tampon brut et utiliser l’arithmétique de pointeur pour copier, comme en C, le plus rapidement possible. La REPLACE( ) en SQL le gérera comme ça pour vous.

1
Matthew Erwin
string input =Yourinputstring;
string[] strings = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (string value in strings)
{
   string newv= value.Trim();
   if (newv.Length > 0)
   newline += value + "\r\n";
}
0
string s = " Your Text ";

string new = s.Replace(" ", string.empty);

// Output:
// "YourText"
0
Butzke

Le moyen le plus rapide et le plus général de le faire (les fins de ligne, les onglets seront également traités). Les installations puissantes de Regex ne sont pas vraiment nécessaires pour résoudre ce problème, mais Regex peut réduire les performances.

new string
    (stringToRemoveWhiteSpaces
       .Where
       (
         c => !char.IsWhiteSpace(c)
       )
       .ToArray<char>()
    )
0
CSharpCoder