C# 字符串操作函数的帮助

C# 字符串操作函数的帮助,c#,.net,string,C#,.net,String,我有一组字符串,其中包含一个或多个由逗号分隔的问号、一个逗号加上一个或多个空格,或者两者都有。所以这些字符串都是可能的: 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 B

我有一组字符串,其中包含一个或多个由逗号分隔的问号、一个逗号加上一个或多个空格,或者两者都有。所以这些字符串都是可能的:

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

没有regex或Linq,最好的方法是什么?

如果你不想要regex或Linq,我只需要写一个循环,并使用这个问题中的“ReplaceFirst”方法在字符串上循环,替换每个出现的?使用适当的@P#\

也许是这样的:

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

请注意,“ReplaceFirst”不是字符串上的标准方法-您必须实现它(例如,在本例中作为扩展方法)。

如果您不需要正则表达式或LINQ,我只需编写一个循环,并使用此问题中的“ReplaceFirst”方法在字符串上循环,替换出现的每个?使用适当的@P#\

也许是这样的:

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

请注意,“ReplaceFirst”不是字符串的标准方法-您必须实现它(例如,在本例中,作为扩展方法)。

为什么不在代码中定义适当大小写的参数时生成SQL,并在准备好后在最后执行它呢

为什么不在代码中定义适当大小写的参数时生成SQL,并在代码准备就绪时将其交给执行

我认为像下面这样的东西应该可以做到这一点

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("?");
}

我认为下面这样的东西应该可以做到

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("?");
}

在您的输出示例中,我忽略了对空格的修剪,因为如果在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();
} 
public静态字符串GetParameterizedString(字符串s)
{
var sb=新的StringBuilder();
var sArray=s.Split(“?”);
对于(var i=0;i
在输出示例中,我忽略了对空格的修剪,因为如果要在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();
} 
public静态字符串GetParameterizedString(字符串s)
{
var sb=新的StringBuilder();
var sArray=s.Split(“?”);
对于(var i=0;i
如果您想要开箱即用的东西:)

PCounter在哪里是这样的

class PCounter{
    int i = 0;
    public override string ToString(){
        return "@P" + (++i);
    }
}

如果您想要开箱即用的东西:)

PCounter在哪里是这样的

class PCounter{
    int i = 0;
    public override string ToString(){
        return "@P" + (++i);
    }
}

哈哈。在我读你剩下的答案之前,我错过了
String
ReplaceFirst
方法,这让我很生气。天哪,你想要支票而不做任何实际工作吗?:)哈哈。在我读你剩下的答案之前,我错过了
String
ReplaceFirst
方法,这让我很生气。天哪,你想要支票而不做任何实际工作吗?:)SQL已经为允许参数使用问号的数据库生成,我们现在必须将其用于不允许参数使用问号的数据库。SQL已经为允许参数使用问号的数据库生成,我们现在必须将其用于不允许参数使用问号的数据库。空格仅影响我的OCD,但幸运的是,我不必看这些问题哈哈,希望我的示例足够整洁。在SQL Server(这不是)中,这样的查询中的空格可能会影响执行计划缓存。两个仅因空间不同而不同的查询不会从彼此的缓存计划中获益(无论如何,我非常确定)@音乐:这可能是真的,但在我看来这是一个更大的问题。我唯一的小问题是第二个
var
,因为Split()返回的类型(可以说)不明显。毫无意义,因为我被困在C#2.0中空格只会影响我的强迫症,但幸运的是,我不必看这些问题。:)哈哈,希望我的示例足够整洁。在SQL Server(这不是)中,这样的查询中的空格可能会影响执行计划缓存。两个仅因空间不同而不同的查询不会从彼此的缓存计划中获益(无论如何,我非常确定)@音乐:这可能是真的,但在我看来这是一个更大的问题。我唯一的小问题是第二个
var
,因为Split()返回的类型(可以说)不明显。毫无意义,因为我被困在C#2.0中那很酷。我不知道每个占位符都会重新调用arg的ToString方法。这很酷。我没有意识到每个占位符都会重新调用arg的ToString方法。