2009-03-04 2 views
0

Может ли кто-нибудь подумать об эффективном способе (временном), чтобы обрезать несколько выбранных символов из середины строки?Как эффективно обрезать выбранные символы из середины строки?

Лучшее, что я придумал был:

public static string Trim(this string word, IEnumerable<char> selectedChars) 
{ 
    string result = word; 
    foreach (char c in selectedChars) 
     result = result.Replace(c.ToString(), ""); 
    return result; 
} 

Но это все еще слишком медленно.

ответ

6

два варианта весной на ум:

  • Используйте StringBuilder
  • Используйте регулярное выражение

Вот StringBuilder версия:

public static string Trim(this string word, IEnumerable<char> selectedChars) 
{ 
    // The best form for this will depend largely on the size of selectedChars 
    // If you can change how you call the method, there are optimisations you 
    // could do here 
    HashSet<char> charSet = new HashSet<char>(selectedChars); 

    // Give enough capacity for the whole word. Could be too much, 
    // but definitely won't be too little 
    StringBuilder builder = new StringBuilder(word.Length); 

    foreach (char c in word) 
    { 
     if (!charSet.Contains(c)) 
     { 
      builder.Append(c); 
     } 
    } 
    return builder.ToString(); 
} 

Опция регулярное выражение может быть очень эффективен, если у вас есть исправление ed набор символов, которые вы хотите обрезать, и может создавать регулярное выражение один раз.

Что-то вроде:

// Put this statically somewhere 
Regex unwantedChars = new Regex("[def]", RegexOptions.Compiled); 

// Then do this every time you need to use it: 
word = unwantedChars.Replace(word, ""); 
Смежные вопросы