从IList<string>或IEnumerable<string>创建逗号分隔的字符串值列表的最干净的方法是什么?
string . join(…)操作在字符串[]上,因此当IList<string>或IEnumerable<string>等类型不能轻松转换为字符串数组时,处理起来很麻烦。
从IList<string>或IEnumerable<string>创建逗号分隔的字符串值列表的最干净的方法是什么?
string . join(…)操作在字符串[]上,因此当IList<string>或IEnumerable<string>等类型不能轻松转换为字符串数组时,处理起来很麻烦。
当前回答
.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);
简单多了:)
其他回答
我能看到的最简单的方法是使用LINQ聚合方法:
string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)
我写了一些扩展方法,以一种有效的方式来做到这一点:
public static string JoinWithDelimiter(this IEnumerable<String> that, string delim) {
var sb = new StringBuilder();
foreach (var s in that) {
sb.AppendToList(s,delim);
}
return sb.ToString();
}
这取决于
public static string AppendToList(this String s, string item, string delim) {
if (s.Length == 0) {
return item;
}
return s+delim+item;
}
如果你想要连接的字符串在对象列表中,那么你也可以这样做:
var studentNames = string.Join(", ", students.Select(x => x.name));
在阅读本文之前,我刚刚解决了这个问题。我的解决方案如下:
private static string GetSeparator<T>(IList<T> list, T item)
{
return (list.IndexOf(item) == list.Count - 1) ? "" : ", ";
}
被称为:
List<thing> myThings;
string tidyString;
foreach (var thing in myThings)
{
tidyString += string.format("Thing {0} is a {1}", thing.id, thing.name) + GetSeparator(myThings, thing);
}
我也可以这样简单地表达,也会更有效率:
string.Join(“,”, myThings.Select(t => string.format(“Thing {0} is a {1}”, t.id, t.name));
下面是我用在其他语言中使用过的方法:
private string ToStringList<T>(IEnumerable<T> list, string delimiter)
{
var sb = new StringBuilder();
string separator = String.Empty;
foreach (T value in list)
{
sb.Append(separator).Append(value);
separator = delimiter;
}
return sb.ToString();
}