Какой лучший способ удалить строки? - PullRequest
4 голосов
/ 12 июля 2011

Мне нужны идеи с лучшей производительностью для удаления / фильтрации строк

У меня есть:

string Input = "view('512', 3, 159);";

Какой самый лучший способ убрать "view (" и ");" а цитаты? Я могу сделать это:

Input = Input.Replace("view(","").Replace("'","").Replace("\"","").Replace(");",""); 

но это выглядит довольно не элегантно.

Input.Split('(')[1].Split(')')[0].Replace("'", "");

кажется, что лучше

Я не хочу делать это с помощью регулярного выражения; Мне нужно сделать приложение быстрее, что я могу. Заранее спасибо! :)

Ответы [ 10 ]

4 голосов
/ 12 июля 2011

Вы можете использовать простой оператор linq:

string Input = "view('512', 3, 159);";

string output = new String( Input.Where( c => Char.IsDigit( c ) || c == ',' ).ToArray() );

Вывод: 512,3159

Если вам нужны пробелы, просто добавьте проверку в предложении where.

2 голосов
/ 12 июля 2011

Надеюсь, это поможет

Regex.Replace("view('512', 3, 159);",@"[(view)';]","")
2 голосов
/ 12 июля 2011
char[] Output = Input.SkipWhile(x => x != '(') // skip before open paren
                     .Skip(1)                  // skip open paren
                     .TakeWhile(x => x != ')') // take everything until close paren
                     .Where(x => x != '\'' && x != '\"') // except quotes
                     .ToArray();
return new String(Output);
2 голосов
/ 12 июля 2011

Вы можете использовать только Substring для удаления view( и );:

Input.Substring(5, Input.Length - 7)

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

Итак:

Input =
  Input.Substring(5, Input.Length - 7)
  .Replace("'", String.Empty)
  .Replace("\"", String.Enmpty);
1 голос
/ 12 июля 2011

Почему вы не хотите использовать регулярные выражения?Регулярные выражения сильно оптимизированы и будут намного быстрее, чем любой хак, написанный от руки.

Это Java (так как я запускаю Linux и не могу запустить C # в результате), но я надеюсь, что вы поняли идею.

input.replace("view(","").replace("'","").replace("\"","").replace(");",""); 

Миллион повторений вышеописанного выполняется примерно за 6 секунд на моем компьютере.Принимая во внимание, что приведенное ниже регулярное выражение выполняется примерно за 2 секунды.

// create java's regex matcher object
// matcher is looking for sequences of digits (valid integers)
Matcher matcher = Pattern.compile("(\\d+)").matcher(s);
StringBuilder builder = new StringBuilder();
// whilst we can find matches append the match plus a comma to a string builder
while (matcher.find()) {
    builder.append(matcher.group()).append(',');
}
// return the built string less the last trailing comma
return builder.substring(0, builder.length()-1);

Если вы хотите найти действительные десятичные числа и целые числа, используйте вместо этого следующий шаблон.Хотя он работает немного медленнее, чем оригинал.

"(\\d+(\\.\\d*)?)"
1 голос
/ 12 июля 2011
    var result = new string(Input.ToCharArray().
SkipWhile (i => i != '\'').
TakeWhile (i => i != ')').ToArray());
1 голос
/ 12 июля 2011

IndexOf, LastIndexOf и Substring, вероятно, самые быстрые.

string Input = "view('512', 3, 159);"; 
int p1 = Input.IndexOf('(');
int p2 = Input.LastIndexOf(')');
Input = Input.Substring (p1 + 1, p2 - p1 - 1);
1 голос
/ 12 июля 2011

Используйте следующее:

            System.Text.StringBuilder sb=new System.Text.StringBuilder();
        int state=0;
        for(var i=0;i<Input.Length;i++){
            switch(state){
                case 0: // beginning
                    if(Input[i]=='('){
                        state=1; // seen left parenthesis
                    }
                    break;
                case 2: // seen end parentheses
                    break; // ignore
                case 1:
                    if(Input[i]==')'){
                        state=2; // seen right parentheses
                    } else if(Input[i]!='\''){

                        sb.Append(Input[i]);
                    }
                    break;
            }
        }
        Console.WriteLine(sb.ToString());
0 голосов
/ 12 июля 2011

Более общий

void Main()
{
    string Input = "view('512', 3, 159);";
    var statingPoint = Input.IndexOf('(') + 1;

    var result = Input.Substring(statingPoint, Input.IndexOf(')') - statingPoint);
}
0 голосов
/ 12 июля 2011

самый быстрый путь будет Input = Input.Substring(5, Input.Length - 7)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...