Я хотел бы взять 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 (от идеи Марра)
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 с использованием перечислителя(из решения Мартина)
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();
}