在C#中:在以逗号分隔的字符串列表中,在字符串周围添加引号。

76

这个问题很可能有一个简单的答案,但我可能没有喝足够的咖啡自己解决:

如果我有一个逗号分隔的字符串,例如:

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

我相信有人会用正则表达式回答这个问题。我认为这应该是解决这个问题的方法,但今天早上我对正则表达式也不熟悉。 - Codewerks
不,我认为FOR有最简单的解决方案...记住,使用正则表达式,你现在有两个问题。 :) http://www.codinghorror.com/blog/archives/001016.html - John Rudy
17个回答

119
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());

1
你需要在字符串的开头和结尾添加单引号。 - Maxam
我是这样使用它的,在代码中:sqlq = sqlq + "AND cc.code in ('" + inpCourseCodes.Text.Replace(",", "','") + "') "); - 但是首先我测试了inpCourseCodes.Text不为null。 - John Dunagan
1
我想提出以下基于LINQ的解决方案:string list = "Fred,Sam,Mike,Sarah"; string newList = string.Join(",", list.Split(',').Select(x => string.Format("'{0}'", x)).ToList()); - Mudasser Mian
我会通过避免手动污染来进一步简化解决方案。string replaced = String.Format("'{0}'",s.Replace(",", "','"));这并不是什么大问题,但我倾向于尽可能避免手动拼接。 - I think I can code
LINQ解决方案绝对是最佳选择,因为它增强了意图和可读性。使用C# 6,您还可以使用字符串插值来简化代码。例如:.Select(x => $"'{x}'").ToList() - Trevor.Screws
显示剩余4条评论

35

跟随Jon Skeet上面的例子,这是对我有效的。我已经有一个名为__messages的List<String>变量,所以我做了以下操作:

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

29
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,特别是支持 IEnumerable<string> 版本的 String.Join...

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

在 Stack Overflow 上有一个 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}'"));

我正在尝试使用您的方法,但是出现了“类型参数声明必须是标识符而不是类型”的错误。我的扩展类被声明为“public static class Extensions”。这可能是原因吗? - tinonetic
1
@user919426:不是,它只是坏了。我现在已经修好了。 - Jon Skeet

19
string[] splitList = list.Split(',');
string newList = "'" + string.Join("','", splitList) + "'";

我喜欢它的巧妙性,但是理解起来更困难(因为它不像引用每个字符串并用逗号重新连接那样直截了当)。无论如何还是很好的 :) - Jon Skeet
我喜欢这个答案比被选中的更好。谢谢! - CleanBold
我认为这种方式在某些情况下会在输出字符串末尾得到一个空字符串('')。对于这些情况,这可能不是最佳解决方案。 - Liad Magen

7

基于Jon Skeet的示例,但针对.NET 4+进行了现代化改进:

// [ "foo", "bar" ] => "\"foo\"", "\"bar\""  
string.Join(", ", strList.Select(x => $"\"{x}\""));

4
我认为最简单的方法是先使用Split,然后再使用Join
string nameList = "Fred,Sam,Mike,Sarah";
string[] names = nameList.Split(',');
string quotedNames = "'" + string.Join("','", names) + "'";

3

我不会写C#代码,但这段简单的JavaScript代码可能很容易适应:

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

它只是将边界替换为单引号(字符串开头/结尾,从单词字符到非标点符号的转换)。


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);

1

如果您正在使用JSON,以下函数将会有所帮助:

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

1

我的要求:

  1. 使用逗号分隔项目。
  2. 用双引号包装所有项目。
  3. 转义字符串中的现有双引号。
  4. 处理空字符串以避免错误。
  5. 不必为空字符串打包双引号。
  6. 以回车和换行符终止。

    string.Join(",", lCol.Select(s => s == null ? null : ("\"" + s.Replace("\"", "\"\"") + "\""))) + "\r\n";


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接