从IList<string>或IEnumerable<string>创建逗号分隔的字符串值列表的最干净的方法是什么?
string . join(…)操作在字符串[]上,因此当IList<string>或IEnumerable<string>等类型不能轻松转换为字符串数组时,处理起来很麻烦。
从IList<string>或IEnumerable<string>创建逗号分隔的字符串值列表的最干净的方法是什么?
string . join(…)操作在字符串[]上,因此当IList<string>或IEnumerable<string>等类型不能轻松转换为字符串数组时,处理起来很麻烦。
当前回答
在这个讨论中有点晚了,但这是我的贡献。我有一个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()效率更低。
其他回答
我能看到的最简单的方法是使用LINQ聚合方法:
string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)
.NET 4 +。
IList<string> strings = new List<string>{"1","2","testing"};
string joined = string.Join(",", strings);
Detail & Pre .Net 4.0解决方案
IEnumerable<string>可以很容易地用LINQ转换成一个字符串数组。NET 3.5):
IEnumerable<string> strings = ...;
string[] array = strings.ToArray();
如果你需要,编写等效的helper方法很容易:
public static T[] ToArray(IEnumerable<T> source)
{
return new List<T>(source).ToArray();
}
然后这样称呼它:
IEnumerable<string> strings = ...;
string[] array = Helpers.ToArray(strings);
然后你可以调用string.Join。当然,你不需要使用helper方法:
// C# 3 and .NET 3.5 way:
string joined = string.Join(",", strings.ToArray());
// C# 2 and .NET 2.0 way:
string joined = string.Join(",", new List<string>(strings).ToArray());
后者有点拗口:)
这可能是最简单的方法,而且性能也很好——关于性能究竟是什么样的,还有其他问题,包括(但不限于)这个问题。
从。net 4.0开始,字符串中有更多的重载可用。加入,你可以这样写
string joined = string.Join(",", strings);
简单多了:)
我们有一个效用函数,大概是这样的
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() );
特定需求时,我们应该用',用ex:
string[] arr = { "jj", "laa", "123" };
List<string> myList = arr.ToList();
// 'jj', 'laa', '123'
Console.WriteLine(string.Join(", ",
myList.ConvertAll(m =>
string.Format("'{0}'", m)).ToArray()));
供你参考,.NET 4.0版本的string.Join()有一些额外的重载,用于IEnumerable,而不仅仅是数组,包括一个可以处理任何类型T的重载:
public static string Join(string separator, IEnumerable<string> values)
public static string Join<T>(string separator, IEnumerable<T> values)