【发布时间】:2010-09-16 19:28:56
【问题描述】:
我想采用HashSet<String> 并将其优雅地转换为字符串。我可以这样迭代:
HashSet<String> words = new HashSet<string>() { "alpha", "beta", "delta" };
string joined = "";
foreach (var w in words)
joined += w + ",";
if(joined.Length > 0)
joined = joined.SubString(0,joined.Length-1); // remove final comma
有没有LinQ 的方式可以优雅而高效地做到这一点?
我能想到的唯一方法是先将其转换为数组:
HashSet<String> words = new HashSet<string>() { "alpha", "beta", "delta" };
string joined = String.Join(",",words.ToArray());
但是,我正在做双重转换。会不会有一些方便、高效、清晰的 LinQ 表达式?
答案 1(来自 marr 的想法)
public static string JoinItems(this IEnumerable<string> items, string joiner) {
StringBuilder sb = new StringBuilder("");
foreach (var i in items)
sb.AppendFormat("{0}{1}",i,joiner);
if(sb.Length>0)
return sb.Remove(sb.Length - joiner.Length, joiner.Length).ToString();
else
return sb.ToString();
}
使用枚举器的答案 2(来自 Martin 的解决方案)
public static string JoinItems<T>(this IEnumerable<T> items, string delim) {
var sb = new StringBuilder();
var i = items.GetEnumerator();
if (i.MoveNext()) {
sb.Append(i.Current);
while (i.MoveNext()) {
sb.Append(delim);
sb.Append(i.Current);
}
}
return sb.ToString();
}
【问题讨论】:
-
也许你不知道 string.Join 的重载需要一个可枚举的? (其中包括 HashSet
) -
@Kirk - 只有 4.0 有这种过载。 3.5 没有。 msdn.microsoft.com/en-us/library/…