2008-10-31 57 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; 
    }