1. ホーム
  2. c#

[解決済み] IEnumerable<char> から文字列へ [重複]。

2022-04-26 13:46:26

質問

今まで一度も遭遇したことがなかったのですが、今回遭遇して、本当に簡単な方法で IEnumerable<char> から string .

私が思いつく最良の方法は string str = new string(myEnumerable.ToArray()); しかし、私には、これでは新しい char[] を作成し、その後に新しい string というのは、高い気がします。

これは、.NETフレームワークのどこかに組み込まれている一般的な機能だと思ったのですが。もっと簡単な方法はないのでしょうか?

興味のある方のために説明すると、私がこれを使いたい理由は、LINQを使って文字列をフィルタリングするためです。

string allowedString = new string(inputString.Where(c => allowedChars.Contains(c)).ToArray());

解決方法は?

を使用することができます。 String.Concat() .

var allowedString = String.Concat(
    inputString.Where(c => allowedChars.Contains(c))
);

洞窟 : この方法は、若干のパフォーマンスへの影響があります。 String.Concat は文字の集合を特別扱いしないので、あたかもすべての文字が文字列に変換され、前述のように連結されたかのように動作します。 ドキュメントにある ( で、実際にそうなります。 ). 確かにこれは、このタスクを達成するための組み込みの方法を提供しますが、もっとうまくできるはずです。

フレームワーク内で char ということで、実装する必要があります。 文字列ビルダーに文字を追加する単純なループを作成するのは簡単です。


これは開発機で取ったベンチマークですが、だいたい合っているようです。

32ビットのリリースビルドで、300文字のシーケンスを1000000回繰り返しました。

ToArrayStringです。       00:00:03.1695463
コンカット               00:00:07.2518054
StringBuilderChars: 00:00:03.1335455
StringBuilderStrings: 00:00:06.4618266

static readonly IEnumerable<char> seq = Enumerable.Repeat('a', 300);

static string ToArrayString(IEnumerable<char> charSequence)
{
    return new String(charSequence.ToArray());
}

static string Concat(IEnumerable<char> charSequence)
{
    return String.Concat(charSequence);
}

static string StringBuilderChars(IEnumerable<char> charSequence)
{
    var sb = new StringBuilder();
    foreach (var c in charSequence)
    {
        sb.Append(c);
    }
    return sb.ToString();
}

static string StringBuilderStrings(IEnumerable<char> charSequence)
{
    var sb = new StringBuilder();
    foreach (var c in charSequence)
    {
        sb.Append(c.ToString());
    }
    return sb.ToString();
}