したい:
以下でこれを行うことができますが、最後以外の「Id」サブストリングがある場合、それらは爆発します。文字数の引数を取るRemoveFromEnd()メソッドはありますか?
if (column.EndsWith("Id"))
{
//remove last 2 characters
column = column.replace("Id", "");
}
この解決策 :これはこれを行う:
column = System.Text.RegularExpressions.Regex.Replace(column, "Id$", "");
しかし、それはかなり遅いと言い、私は非常に高速にしたいコードブロック内でこのコードを実行するつもりなので、より高速なソリューションが利用可能かどうかを見たかったです。
String.Substring
それができる:
column = column.Substring(0, column.Length - 2);
これを使用して、独自のRemoveFromEnd
をロールできます。
public static string RemoveFromEnd(this string s, string suffix)
{
if (s.EndsWith(suffix))
{
return s.Substring(0, s.Length - suffix.Length);
}
else
{
return s;
}
}
SubString
メソッドの代わりに、Regex.Replace
from System.Text.RegularExpressions
:
using System.Text.RegularExpressions;
...
column = Regex.Replace(column, @"Id$", String.Empty);
この方法により、テストを回避できますが、実際に速度が向上するかどうかはわかりません:-)。少なくとも、一度に複数のことを確認する必要がある場合に役立つ代替案。
正規表現をコンパイルして再利用すると、パフォーマンスが向上し、静的メソッドの呼び出しの代わりに使用でき、次のように使用できます。
// stored as a private member
private static Regex _checkId = new Regex(@"Id$", RegexOptions.Compiled);
...
// inside some method
column = _checkId.Replace(column, String.Empty);
削除するパーツの長さがわかっているため、 Substring
を使用できます。
if (column.EndsWith("Id"))
{
column = column.Substring(0, column.Length - 2);
}
独自に作成する場合は、RemoveFromEnd()
メソッドを使用できます。
public static string RemoveFromEnd(this string str, string toRemove)
{
if (str.EndsWith(toRemove))
return str.Substring(0, str.Length - toRemove.Length);
else
return str;
}
次のように使用できます。
column = column.RemoveFromEnd("Id");
これを試して:
if (column.IndexOf("Id") == column.Length-2) {
column = column.Substring(0, column.Length-2);
}
@Jonの回答に追加するいくつかのメモ:
このケースを区別せずに実行しますか?
if (column.ToLower().EndsWith("id")) { column = column.Remove(column.Length - 2); }
IDが文字列内で一意であり、常に削除する必要がある場合...
#No if check....
column = column.Replace("Id", "");
大文字と小文字が区別されず、一度しか発生しない場合は、最初のチェックを使用します。