从IList<string>或IEnumerable<string>创建逗号分隔的字符串值列表的最干净的方法是什么?
string . join(…)操作在字符串[]上,因此当IList<string>或IEnumerable<string>等类型不能轻松转换为字符串数组时,处理起来很麻烦。
从IList<string>或IEnumerable<string>创建逗号分隔的字符串值列表的最干净的方法是什么?
string . join(…)操作在字符串[]上,因此当IList<string>或IEnumerable<string>等类型不能轻松转换为字符串数组时,处理起来很麻烦。
当前回答
由于我在搜索对象列表的特定属性(而不是ToString())时到达这里,这里是对接受的答案的补充:
var commaDelimited = string.Join(",", students.Where(i => i.Category == studentCategory)
.Select(i => i.FirstName));
其他回答
使用. net 3.5中的Linq扩展,可以很容易地将它们转换为数组。
var stringArray = stringList.ToArray();
我们有一个效用函数,大概是这样的
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() );
我的答案就像上面的聚合解决方案,但应该更少的调用堆栈,因为没有显式的委托调用:
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()作为默认值。
要从IList<string>或IEnumerable<string>创建一个逗号分隔的列表,除了使用string. join()外,还可以使用StringBuilder。AppendJoin方法:
new StringBuilder().AppendJoin(", ", itemList).ToString();
or
$"{new StringBuilder().AppendJoin(", ", itemList)}";
下面是我用在其他语言中使用过的方法:
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();
}