转换List<;字符串>;转换为单个逗号分隔的字符串

本文关键字:转换 字符串 分隔 单个逗 List gt lt | 更新日期: 2023-09-27 18:21:22

可能重复:
连接字符串的最有效方法

我有一份清单。创建一个列表中所有字符串都用","分隔的字符串的最佳方法是什么。

提前感谢

转换List<;字符串>;转换为单个逗号分隔的字符串

可能:

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

如果您没有使用.NETFramework4,IEnumerable的重载将丢失,因此您需要首先将其转换为数组:

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

您可以在MSDN上阅读有关string.Join的更多信息。

几个选项之一:

var concat = String.Join(",", mylist.ToArray());
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
}

使用迭代程序很有趣

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

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

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

为什么要有一个Delimit扩展方法,当字符串。加入会在这个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方法和字符串的一些组合来完成。Join方法。以下示例演示了一些我认为用这些内置方法无法完成的事情。

可以使用可变分隔符。以下示例根据要分隔的两个值,使用"<"、">"或"="分隔整数。此示例还使用一个重载,该重载采用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<46=46<76<98>63<93>70。。。

最后,并不是说这是必须要做的事情,而是为了演示的目的,假设您有一个web UI控件列表(List<System.Web.UI.Control>),并且您希望在每个TextBox控件之前插入一个HTML <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

以下是上面代码示例使用的扩展方法:

static class DelimitExtensions
{
    public static IEnumerable<T> Delimit<T>(this IEnumerable<T> source, T separator)
    {
        using (var enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                yield return enumerator.Current;
                while (enumerator.MoveNext())
                {
                    yield return separator;
                    yield return enumerator.Current;
                }
            }
        }
    }
    public static IEnumerable<T> Delimit<T>(this IEnumerable<T> source, T separator, T prefix, T suffix)
    {
        using (var enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                yield return prefix;
                yield return enumerator.Current;
                yield return suffix;
                while (enumerator.MoveNext())
                {
                    yield return separator;
                    yield return prefix;
                    yield return enumerator.Current;
                    yield return suffix;
                }
            }
        }
    }
    public static IEnumerable<T> Delimit<T>(this IEnumerable<T> source, Func<T, T, T> separator, Func<T, T> prefix, Func<T, T> suffix)
    {
        using (var enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                if (prefix != null)
                    yield return prefix(enumerator.Current);
                yield return enumerator.Current;
                if (suffix != null)
                    yield return suffix(enumerator.Current);
                T previous = enumerator.Current;
                while (enumerator.MoveNext())
                {
                    if (separator != null)
                        yield return separator(previous, enumerator.Current);
                    if (prefix != null)
                        yield return prefix(enumerator.Current);
                    yield return enumerator.Current;
                    if (suffix != null)
                        yield return suffix(enumerator.Current);
                    previous = enumerator.Current;
                }
            }
        }
    }
    public static IEnumerable<TOut> Delimit<TIn, TOut>(this IEnumerable<TIn> source, Func<TIn, TOut> convert, Func<TIn, TIn, TOut> separator, Func<TIn, TOut> prefix, Func<TIn, TOut> suffix)
    {
        using (var enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                if (prefix != null)
                    yield return prefix(enumerator.Current);
                yield return convert(enumerator.Current);
                if (suffix != null)
                    yield return suffix(enumerator.Current);
                TIn previous = enumerator.Current;
                while (enumerator.MoveNext())
                {
                    if (separator != null)
                        yield return separator(previous, enumerator.Current);
                    if (prefix != null)
                        yield return prefix(enumerator.Current);
                    yield return convert(enumerator.Current);
                    if (suffix != null)
                        yield return suffix(enumerator.Current);
                    previous = enumerator.Current;
                }
            }
        }
    }
}