2008-10-31 52 views
42

這可能有一個簡單的名單,但我不能有足夠的咖啡數字出來我自己:在C#中:添加各地串行情以逗號分隔的字符串

如果我有一個逗號分隔字符串,如:

string list = "Fred,Sam,Mike,Sarah"; 

如何將獲得每個元素和它周圍添加引號,並把它貼在後面像這樣的字符串:

string newList = "'Fred','Sam','Mike','Sarah'"; 

我假設循環訪問每個人都成爲一個開始,但是那之後我就陷入了困境。

一種方案是醜陋:

int number = 0; 
string newList = ""; 
foreach (string item in list.Split(new char[] {','})) 
{ 
    if (number > 0) 
    { 
     newList = newList + "," + "'" + item + "'"; 
    } 
    else 
    { 
     newList = "'" + item + "'"; 
    } 
    number++; 
} 
+0

我敢肯定有人有一個正則表達式的答案。我認爲這將是實現這一目標的方式,但是我今天早上還沒有跟上我的正則表達式。 – Codewerks 2008-10-31 15:59:24

+0

不,我認爲FOR有最簡單的解決方案...記住,用正則表達式,現在你有兩個問題。 :) http://www.codinghorror.com/blog/archives/001016.html – 2008-10-31 16:05:07

回答

69
string s = "A,B,C"; 
string replaced = "'"+s.Replace(",", "','")+"'"; 

感謝您的意見,我已經錯過了外部報價。

當然..如果源是一個空字符串,你想要額外的引號嗎?而如果輸入是一堆空白......怎麼辦?我的意思是,爲了提供100%完整的解決方案,我可能會要求提供單元測試列表,但我希望我的直覺能夠回答你的核心問題。

更新:基於LINQ的替代也被建議(使用的String.Format,因此不具有的附加益處擔心前導/尾隨引號):

string list = "Fred,Sam,Mike,Sarah"; 
string newList = string.Join(",", list.Split(',').Select(x => string.Format("'{0}'", x)).ToList()); 
+0

這有點簡化它。人們只需要在字符串的開始和結尾添加引號就可以完成它。 – 2008-10-31 15:59:44

+1

您需要將單引號添加到字符串的開頭和結尾。 – Maxam 2008-10-31 15:59:58

+0

那會給你 「Fred」,「Sam」,「Mike」,「Sarah」; – Codewerks 2008-10-31 16:00:17

15
string[] splitList = list.Split(','); 
string newList = "'" + string.Join("','", splitList) + "'"; 
20
string[] bits = list.Split(','); // Param arrays are your friend 
for (int i=0; i < bits.Length; i++) 
{ 
    bits[i] = "'" + bits[i] + "'"; 
} 
return string.Join(",", bits); 

或者你可以使用LINQ,特別是與一個版本的string.join支持IEnumerable<string>的...

return list.Split(',').Select(x => "'" + x + "'").JoinStrings(","); 

有一個在所有其他地方的JoinStrings實現...我會看看它。

編輯:嗯,是不太JoinStrings我在想的,所以在這裏它是:

public static string JoinStrings<T>(this IEnumerable<T> source, 
            string separator) 
{ 
    StringBuilder builder = new StringBuilder(); 
    bool first = true; 
    foreach (T element in source) 
    { 
     if (first) 
     { 
      first = false; 
     } 
     else 
     { 
      builder.Append(separator); 
     } 
     builder.Append(element); 
    } 
    return builder.ToString(); 
} 

這些天string.Join有一個通用的過載,雖然不是,所以你可以只使用:

return string.Join(",", list.Split(',').Select(x => $"'{x}'")); 
2

我不會寫C#代碼,但是這個簡單的JavaScript代碼可能容易適應:

var s = "Fred,Sam,Mike,Sarah"; 
alert(s.replace(/\b/g, "'")); 

它只是用單引號替換邊界(字符串的開始/結束,從字符非標點符號的轉換)。

4

我認爲最簡單的事情是Split然後Join

string nameList = "Fred,Sam,Mike,Sarah"; 
string[] names = nameList.Split(','); 
string quotedNames = "'" + string.Join("','", names) + "'"; 
1
string list = "Fred,Sam,Mike,Sarah"; 

string[] splitList = list.Split(','); 

for (int i = 0; i < splitList.Length; i++) 
    splitList[i] = String.Format("'{0}'", splitList[i]); 

string newList = String.Join(",", splitList); 
0

@PhiLho的JavaScript正則表達式解決方案的C#實現看起來像下面這樣:

Regex regex = new Regex(
    @"\b", 
    RegexOptions.ECMAScript 
    | RegexOptions.Compiled 
    ); 

string list = "Fred,Sam,Mike,Sarah"; 
string newList = regex.Replace(list,"'"); 
0

我 「不太成熟」 的做法...... 我想這是一件好事練習使用StringBuilder,因爲列表可能非常大。

string list = "Fred,Sam,Mike,Sarah"; 
StringBuilder sb = new StringBuilder(); 

string[] listArray = list.Split(new char[] { ',' }); 

for (int i = 0; i < listArray.Length; i++) 
{ 
    sb.Append("'").Append(listArray[i]).Append("'"); 
    if (i != (listArray.Length - 1)) 
     sb.Append(","); 
} 
string newList = sb.ToString(); 
Console.WriteLine(newList); 
0

你打算處理大量的CSV嗎?如果是這樣,你還應該考慮使用庫來做到這一點。不要重新發明輪子。不幸的是,我還沒有找到像Python的CSV庫一樣簡單的庫,但是我看過FileHelpers(免費)reviewed at MSDN Magazine,它看起來很不錯。這裏也可能有其他免費的圖書館。這一切都取決於你將做多少處理。通常它會增長,直到你意識到你會更好地使用圖書館。

14

以上Jon Skeet的例子,這是對我有用的。我已經有了一個List<String>變量稱爲__messages所以這是我做過什麼:

string sep = String.Join(", ", __messages.Select(x => "'" + x + "'")); 
1

如果使用JSON,下面的功能將有助於

var string[] keys = list.Split(','); 
console.log(JSON.stringify(keys)); 
1

我的要求:

  1. 單獨項目使用逗號。
  2. 將所有項目用雙引號括起來。
  3. 轉義字符串中的現有雙引號。
  4. 處理空字符串以避免錯誤。
  5. 不要打擾在雙引號中包裝空字符串。
  6. 以回車和換行結束。 (「\」,「\」\「」)+「(」,「;」,「\」\「」)+「 \ 「」)))+ 「\ r \ n」 個;

0

下面是使用字符串內插的C#6溶液

string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
         .Select(x => $"'{x}'") 
         .ToList()); 

或者,如果你喜歡用字符串的C#5選項。格式:

string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
         .Select(x => String.Format("'{0}'", x)) 
         .ToList()); 

使用StringSplitOptions將r刪除任何空的值,這樣你就不會有任何空的引號,如果這是你想要避免的。

0

我發現這個問題

我通過選定項目的值從使用LINQ網格綁定的列表的新的解決方案,在這之後加入逗號分隔的字符串,用於通過使用的string.join每個字符串集合()屬性。

String str1 = String.Empty; 
String str2 = String.Empty;    
//str1 = String.Join(",", values); if you use this method,result "X,Y,Z" 
    str1 =String.Join("'" + "," + "'", values); 
//The result of str1 is "X','Y','Z" 
    str2 = str1.Insert(0, "'").Insert(str1.Length+1, "'"); 
//The result of str2 is 'X','Y','Z' 

我希望這會有所幫助!!!!!!

0

對於誰愛擴展方法像我一樣,這裏的人是:

public static string MethodA(this string[] array, string seperatedCharecter = "|") 
    { 
     return array.Any() ? string.Join(seperatedCharecter, array) : string.Empty; 
    } 

    public static string MethodB(this string[] array, string seperatedChar = "|") 
    { 
     return array.Any() ? MethodA(array.Select(x => $"'{x}'").ToArray(), seperatedChar) : string.Empty; 
    }