繁体   English   中英

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

[英]In C#: Add Quotes around string in a comma delimited list of strings

这可能有一个简单的答案,但我一定没有喝足够的咖啡来自己弄清楚:

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

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

在 SO 上的其他地方有一个 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}'"));

按照上面 Jon Skeet 的例子,这对我有用。 我已经有一个名为 __messages 的List<String>变量,所以这就是我所做的:

string sep = String.Join(", ", __messages.Select(x => "'" + x + "'"));
string[] splitList = list.Split(',');
string newList = "'" + string.Join("','", splitList) + "'";

我认为最简单的方法是Split然后Join

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

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

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

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

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

它只是用单引号替换边界(字符串的开始/结束,从单词字符非标点符号的转换)。

如果您使用的是 JSON,以下功能会有所帮助

var string[] keys = list.Split(',');
console.log(JSON.stringify(keys));
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. 使用逗号分隔项目。
  2. 用双引号将列表中的所有项目括起来。
  3. 转义字符串中现有的双引号。
  4. 处理空字符串以避免错误。
  5. 不要费心用双引号包裹空字符串。
  6. 以回车和换行结束。

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

@ PhiLho的 JavaScript 正则表达式解决方案的 C# 实现如下所示:

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

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

我的“不太复杂”的方法......我认为使用 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);

您要处理大量 CSV 吗? 如果是这样,您还应该考虑使用库来执行此操作。 不要重新发明轮子。 不幸的是,我还没有找到像 Python 的 CSV 库那么简单的库,但是我在 MSDN 杂志上看到了FileHelpers (免费),它看起来很不错。 可能还有其他免费图书馆。 不过,这一切都取决于您将进行多少处理。 通常它会不断增长,直到您意识到使用库会更好。

这是使用字符串插值的 C# 6 解决方案。

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

或者,如果您更喜欢带有 String.Format 的 C# 5 选项:

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

使用 StringSplitOptions 将删除任何空值,因此您不会有任何空引号,如果这是您要避免的事情。

我为这个问题找到了一个新的解决方案

我使用 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'

我希望这会有所帮助!!!!!!!

对于像我这样喜欢扩展方法的人,这里是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM