将List <string>中的所有字符串转换为单个逗号分隔字符串</string>的最佳方法

时间:2012-01-24 19:36:27

标签: c# .net string visual-studio list

  

可能重复:
  Most efficent way of joining strings

我有一个清单。什么是最好的方法来创建一个单独的sting,其中包含List中的所有字符串,但用','分隔。

提前致谢

4 个答案:

答案 0 :(得分:19)

大概:

var str = string.Join(",", yourList);

如果您不使用.NET Framework 4,则IEnumerable的重载将丢失,因此您需要先将其转换为数组:

var str = string.Join(",", yourList.ToArray()); 

您可以详细了解string.Join at MSDN

答案 1 :(得分:3)

其中一个选项:

var concat = String.Join(",", mylist.ToArray());

答案 2 :(得分:2)

public string getStringFromList(List<string> inputList){
    string returnString = "";
    if(inputList.length < 1)return returnString;
    foreach(string s in inputList){
      returnString += s + ",";
    }
    returnString = returnString.Substring(returnString.length - 2);//remove extra ","
    return returnString
}

答案 3 :(得分:1)

与迭代器一起玩!

定义Delimit扩展方法(如下所示),您可以这样做:

result = string.Concat(values.Delimit(","));

(所有扩展方法都包含在底部的代码示例中)

为什么你想要一个Delimit扩展方法,当string.Join在这个sceanrio中工作得很好?

嗯,您可以通过添加带前缀和后缀参数的重载来更进一步。您可以使用它来生成CSV字符串,例如,如下所示:

// replace " with ""
var escapedValues = values.Select(x => x.Replace("\"", "\"\""));
result = string.Concat(escapedValues.Delimit(",", "\"", "\""));

再向前迈出一步,添加一个带有“智能”(即委托)分隔符的重载。例如,下面显示了与上面相同的CSV方法,但是如果它们包含空格或逗号,则此时值仅由引号括起:

char[] quotables = new char[] { ' ', '\t', '\r', '\n', ',' };
var result3 = string.Concat(escapedValues.Delimit(
    (previous, current) => ",", // always separate with a comma
    // but only surround with quotes if the value contains whitespace or an embedded comma
    current => current.IndexOfAny(quotables) < 0 ? null : "\"",
    current => current.IndexOfAny(quotables) < 0 ? null : "\""));

好的,所有这些先前的例子仍然可以通过现有的Linq方法和string.Join方法的某种组合来完成。以下示例演示了一些我认为无法使用这些内置方法完成的事情。

您可以拥有可变分隔符。以下示例使用“&lt;”,“&gt;”或“=”分隔整数,具体取决于要分隔的两个值。此示例还使用了一个带有Func<int, string>转换参数的重载:

var rng = new Random();
int[] integers = new int[100];
for (int i = 0; i < integers.Length; i++)
    integers[i] = rng.Next(0, 100);

result = string.Concat(integers.Delimit(
    (current) => current.ToString(), // convert int to string
    // separate with either "<", ">", or "="
    (previous, current) => (previous < current) ? " < " : (previous > current) ? " > " : " = ",
    // no prefix or suffix
    null,
    null));

输出:9&lt; 46 = 46&lt; 76&lt; 98> 63&lt; 93> 70 ...

最后,并非这是人们应该做的事情,但为了演示的目的,假设您有一个Web UI控件列表(List<System.Web.UI.Control>),并且您想插入一个HTML {{1在每个TextBox控件之前控制:

<label>

以下代码示例使用的扩展方法如下:

result = controls.Delimit(
    null, // no separator
    (current) => {
        var textbox = current as System.Web.UI.WebControls.TextBox;
        if (textbox == null)
            return null;
        // prefix all TextBox controls with a <label> element
        var label = new System.Web.UI.HtmlControls.HtmlGenericControl("label");
        label.Attributes["for"] = textbox.ClientID;
        label.InnerText = textbox.Attributes["name"];
        return label; },
    null); // no suffix