Помогите с функцией манипуляции со строками - PullRequest
1 голос
/ 06 мая 2010

У меня есть набор строк, которые содержат в себе один или несколько вопросительных знаков, разделенных запятой, запятой плюс один или несколько пробелов или потенциально оба. Так что все эти строки возможны:

BOB AND ?
BOB AND ?,?,?,?,?
BOB AND ?, ?, ? ,?
BOB AND ?,?  ,  ?,?
?,  ?               ,? AND BOB

Мне нужно заменить вопросительные знаки на @P#, чтобы приведенные выше примеры стали:

BOB AND @P1
BOB AND @P1,@P2,@P3,@P4,@P5
BOB AND @P1,@P2,@P3,@P4
BOB AND @P1,@P2,@P3,@P4
@P1,@P2,@P3 AND BOB

Какой лучший способ сделать это без регулярных выражений или Linq?

Ответы [ 5 ]

1 голос
/ 06 мая 2010

Если вы хотите что-то из коробки:)

string toFormat = "?,  ?               ,? AND BOB";
while (toFormat.Contains("  "))
    toFormat = toFormat.Replace("  ", " ");
toFormat = toFormat.Replace("?", "{0}");
string formated = string.Format(toFormat, new PCounter());

Где PCounter такой

class PCounter{
    int i = 0;
    public override string ToString(){
        return "@P" + (++i);
    }
}
1 голос
/ 06 мая 2010

Я проигнорировал усечение пробелов в вашем выходном примере, потому что, если это будет использоваться в операторе SQL, пробелы не имеют значения. Это должно работать довольно хорошо благодаря использованию StringBuilder, а не повторным вызовам Replace, Substring или другим строковым методам .:

public static string GetParameterizedString(string s)
{
    var sb = new StringBuilder();
    var sArray = s.Split('?');
    for (var i = 0; i < sArray.Length - 1; i++)
    {
        sb.Append(sArray[i]);
        sb.Append("@P");
        sb.Append(i + 1);
    }
    sb.Append(sArray[sArray.Length - 1]);
    return sb.ToString();
} 
1 голос
/ 06 мая 2010

Почему бы не сгенерировать ваш SQL, когда вы получаете параметры, определяющие надлежащий CASE в вашем коде, и даете его для выполнения в самом конце, когда он будет готов?

1 голос
/ 06 мая 2010

Если вы не хотите использовать регулярные выражения или LINQ, я бы просто написал цикл и использовал метод ReplaceFirst из этого вопроса для циклического перебора строки, заменяя каждое вхождение? с соответствующим @P #. \

Как заменить * первый экземпляр * строки в .NET?

Может быть, что-то вроде этого:

int i = 0;
while (myString.Contains("?"))
{
    myString = myString.ReplaceFirst("?", "@P" + i);
    i++;
}

Обратите внимание, что «ReplaceFirst» не является стандартным методом для строки - его необходимо реализовать (например, в качестве метода расширения, в данном примере).

0 голосов
/ 06 мая 2010

Я думаю, что-то вроде ниже должно сделать это.

string input = "BOB AND ?,?,?,?,?";
int number = 1;
int index = input.IndexOf("?");
while (index > -1)
{
    input = input.Substring(0, index).Trim() + " @P" + number++.ToString() + input.Substring(index + 1).Trim();
    index = input.IndexOf("?");
}
...