从IList<string>或IEnumerable<string>创建逗号分隔的字符串值列表的最干净的方法是什么?

string . join(…)操作在字符串[]上,因此当IList<string>或IEnumerable<string>等类型不能轻松转换为字符串数组时,处理起来很麻烦。


当前回答

使用. net 3.5中的Linq扩展,可以很容易地将它们转换为数组。

   var stringArray = stringList.ToArray();

其他回答

我的答案就像上面的聚合解决方案,但应该更少的调用堆栈,因为没有显式的委托调用:

public static string ToCommaDelimitedString<T>(this IEnumerable<T> items)
{
    StringBuilder sb = new StringBuilder();
    foreach (var item in items)
    {
        sb.Append(item.ToString());
        sb.Append(',');
    }
    if (sb.Length >= 1) sb.Length--;
    return sb.ToString();
}

当然,可以将签名扩展为独立于分隔符的。我真的不是sb.Remove()调用的粉丝,我想重构它为一个直接的while循环在IEnumerable上,并使用MoveNext()来确定是否写一个逗号。如果我发现了这个解,我就会把它贴出来。


这是我最初想要的:

public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> converter)
{
    StringBuilder sb = new StringBuilder();
    var en = source.GetEnumerator();
    bool notdone = en.MoveNext();
    while (notdone)
    {
        sb.Append(converter(en.Current));
        notdone = en.MoveNext();
        if (notdone) sb.Append(delimiter);
    }
    return sb.ToString();
}

不需要临时数组或列表存储,也不需要StringBuilder Remove()或Length—hack。

在我的框架库中,我对这个方法签名做了一些变化,包括分隔符和转换器参数的每一种组合,分别使用“,”和x.ToString()作为默认值。

我在寻找一个好的c#方法来连接字符串时,就像使用MySql方法CONCAT_WS()一样,进行了这个讨论。此方法与string.Join()方法不同,它不会在字符串为NULL或空时添加分隔符。

CONCAT_WS (', ', tbl Lastname, tbl Firstname)。

如果名字为空,将只返回Lastname,同时

管柱。(", ", strLastname, strFirstname)

将返回strLastname + ", "在同样的情况下。

想要第一个行为,我写了以下方法:

    public static string JoinStringsIfNotNullOrEmpty(string strSeparator, string strA, string strB, string strC = "")
    {
        return JoinStringsIfNotNullOrEmpty(strSeparator, new[] {strA, strB, strC});
    }

    public static string JoinStringsIfNotNullOrEmpty(string strSeparator, string[] arrayStrings)
    {
        if (strSeparator == null)
            strSeparator = "";
        if (arrayStrings == null)
            return "";
        string strRetVal = arrayStrings.Where(str => !string.IsNullOrEmpty(str)).Aggregate("", (current, str) => current + (str + strSeparator));
        int trimEndStartIndex = strRetVal.Length - strSeparator.Length;
        if (trimEndStartIndex>0)
            strRetVal = strRetVal.Remove(trimEndStartIndex);
        return strRetVal;
    }

我知道现在回答这个问题有点晚了,但它可能会对那些在这里寻找这个问题答案的人有所帮助。

你可以这样做:

var finalString = String.Join(",", ExampleArrayOfObjects.Where(newList => !String.IsNullOrEmpty(newList.TestParameter)).Select(newList => newList.TestParameter));

使用ExampleArrayOfObjects。我们将在哪里创建一个非空值的新对象列表

然后进一步在新的对象列表上使用. select,以","作为分隔符连接并生成最终字符串。

有点难看,但很管用:

string divisionsCSV = String.Join(",", ((List<IDivisionView>)divisions).ConvertAll<string>(d => d.DivisionID.ToString("b")).ToArray());

在您给它转换器之后,从列表中给您一个CSV(在本例中d => d.DivisionID.ToString("b"))。

Hacky但工作-可以成为一个扩展方法也许?

这是另一个扩展方法:

    public static string Join(this IEnumerable<string> source, string separator)
    {
        return string.Join(separator, source);
    }