1


1

LinQでHashSet <String>をシリアル化する

「HashSet」を取得して、エレガントに文字列に変換したいと思います。 私はそのように繰り返すことができます:

HashSet words = new HashSet() { "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 words = new HashSet() { "alpha", "beta", "delta" };
string joined = String.Join(",",words.ToArray());

しかし、その後、私は二重変換を行っています。 効率的で明確な便利なLinQ式がありますか?

回答1(marrのアイデアから)

public static string JoinItems(this IEnumerable 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();
}

Enumeratorを使用したANSWER 2(Martinのソリューションから)

public static string JoinItems(this IEnumerable 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();
}

3 Answer


3


私はあなたの方法を取り、最後のコンマを削除する必要がないように修正しました。 また、毎回フォーマットを解析するすべての作業を回避するため、「AppendFormat」を「Append」に変更しました。

public static string JoinItems(this IEnumerable items, string joiner)
{
    StringBuilder sb = new StringBuilder();
    string delim = "";

    foreach (var i in items)
    {
        sb.Append(delim);
        sb.Append(i);
        delim = joiner;
    }

    return sb.ToString();
}


1


String.Join()行に二重変換が表示されません。 ToArray()という変換が1つありますが、これはひどいものではありません。その後、String.Join()を実行します。

http://msdn.microsoft.com/en-us/library/dd992421.aspx [String.Join()]があります .Net 4 that takes an IEnumerable that will work without the conversion. 古いフレームワークバージョンを使用している場合は、「this」パラメーターとしてセパレーターを取り、IEnumerableに結合する文字列の独自の拡張メソッドを作成できます。 パフォーマンスのために必ずstringbuilderを使用してください。


1


これにより、繰り返しごとに余分なコピーやチェックを行わずにトリックを実行できます。

String JoinItems(IEnumerable items) {
  var stringBuilder = new StringBuilder();
  var i = items.GetEnumerator();
  if (i.MoveNext()) {
    stringBuilder.Append(i.Current);
    while (i.MoveNext()) {
      stringBuilder.Append(", ");
      stringBuilder.Append(i.Current);
    }
  }
  return stringBuilder.ToString();
}