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

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


当前回答

有点难看,但很管用:

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

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

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

其他回答

我能看到的最简单的方法是使用LINQ聚合方法:

string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)

您可以使用ToArray将IList转换为数组,然后运行字符串。在阵列上执行Join命令。

Dim strs As New List(Of String)
Dim arr As Array
arr = strs.ToArray

在这个讨论中有点晚了,但这是我的贡献。我有一个IList<Guid> OrderIds要转换为CSV字符串,但以下是通用的,工作与其他类型的未修改:

string csv = OrderIds.Aggregate(new StringBuilder(),
             (sb, v) => sb.Append(v).Append(","),
             sb => {if (0 < sb.Length) sb.Length--; return sb.ToString();});

简短和甜蜜的,使用StringBuilder构造新字符串,缩小StringBuilder的长度以删除最后一个逗号,并返回CSV字符串。

我已经将其更新为使用多个Append()来添加字符串+逗号。根据James的反馈,我使用Reflector来查看StringBuilder.AppendFormat()。原来AppendFormat()使用一个StringBuilder来构造格式字符串,这使得它在这个上下文中比使用多个appendds()效率更低。

如果你想要连接的字符串在对象列表中,那么你也可以这样做:

var studentNames = string.Join(", ", students.Select(x => x.name));

我们有一个效用函数,大概是这样的

public static string Join<T>( string delimiter, 
    IEnumerable<T> collection, Func<T, string> convert )
{
    return string.Join( delimiter, 
        collection.Select( convert ).ToArray() );
}

它可以用来轻松地加入大量的集合:

int[] ids = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233};

string csv = StringUtility.Join(",", ids, i => i.ToString() );

注意,我们在lambda之前有一个集合参数,因为智能感知随后会拾取集合类型。

如果你已经有一个字符串枚举,你需要做的就是ToArray:

string csv = string.Join( ",", myStrings.ToArray() );