2010-05-06 97 views
1

我有一組字符串,其中包含一個或多個由逗號,逗號加上一個或多個空格或潛在地兩者分隔的問號。因此,這些字符串都是可能的:字符串操作函數的幫助

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的最佳方式?

回答

1

我忽略的空間微調您的輸出的例子,因爲如果這是在SQL語句中使用的空間是無關緊要。這應該對使用的StringBuilder執行得很好,由於不是重複調用ReplaceSubstring或其他字符串方法:

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

空格隻影響我的強迫症,但仁慈地我不必看這些查詢。 :) – MusiGenesis 2010-05-06 01:49:28

+0

大聲笑,希望我的例子很整潔。 – RedFilter 2010-05-06 01:53:09

+0

在SQL Server中(這不是)像這樣的查詢中的空格可能會影響執行計劃緩存。兩個只能用空格區分的查詢不會受益於對方的緩存計劃(無論如何我都很確定)。 – MusiGenesis 2010-05-06 01:53:19

1

如果你不想要正則表達式或LINQ,我只需要編寫一個循環,並使用這個問題中的「ReplaceFirst」方法遍歷字符串,替換每個出現的?用適當的@P#\

How do I replace the *first instance* of a string in .NET?

也許是這樣的:

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

注意, 「ReplaceFirst」 不上線的標準方法 - 你要實現它(例如作爲。在這個例子中是擴展方法)。

+0

LOL。在我閱讀剩下的答案之前,我正在踢自己錯過了String的'ReplaceFirst'方法。 Jeez,你想要沒有做任何實際工作的支票? :) – MusiGenesis 2010-05-06 01:35:24

1

爲什麼不生成你的SQL,因爲你的參數在你的代碼中定義了正確的CASE並且在它準備好時在最後執行呢?

+0

SQL已經爲允許參數問號的數據庫生成,我們現在必須將它用於沒有參數的數據庫。 – MusiGenesis 2010-05-06 01:45:36

0

我覺得像下面的東西應該這樣做。

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

如果你想要的東西開箱:)

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); 
    } 
} 
+0

這很酷。我沒有意識到一個arg的ToString方法被每個佔位符重新調用。 – MusiGenesis 2010-05-06 02:12:02