完全な文字列を生成するパフォーマンスのオーバーヘッドを回避するためにToString(int,int)
、インデックス範囲を取るオーバーロードを使用できます。
public static bool EndsWith(this StringBuilder sb, string test)
{
if (sb.Length < test.Length)
return false;
string end = sb.ToString(sb.Length - test.Length, test.Length);
return end.Equals(test);
}
編集StringComparison
:引数を取るオーバーロードを定義することがおそらく望ましいでしょう:
public static bool EndsWith(this StringBuilder sb, string test)
{
return EndsWith(sb, test, StringComparison.CurrentCulture);
}
public static bool EndsWith(this StringBuilder sb, string test,
StringComparison comparison)
{
if (sb.Length < test.Length)
return false;
string end = sb.ToString(sb.Length - test.Length, test.Length);
return end.Equals(test, comparison);
}
編集2 : コメントで Tim S が指摘したように、特定の Unicode 比較に影響する私の回答 (および文字ベースの同等性を前提とする他のすべての回答) に欠陥があります。Unicode では、2 つの (サブ) 文字列が同じ文字列であるとみなされる必要はありません。たとえば、構成済みの文字は、結合マークが後に続くé
文字と同等に扱われるべきです。e
U+0301
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
string s = "We met at the cafe\u0301";
Console.WriteLine(s.EndsWith("café")); // True
StringBuilder sb = new StringBuilder(s);
Console.WriteLine(sb.EndsWith("café")); // False
これらのケースを正しく処理したい場合は、 を呼び出しStringBuilder.ToString()
て組み込みの を使用するのが最も簡単かもしれませんString.EndsWith
。