これは何をしますか?ここで
"This will be a test".Replace("i", "X").Replace("t", String.Empty)
はCHRTRAN
機能の簡単な実装です - 文字列が\0
が含まれており、非常に厄介であるならば、それは動作しません。あなたはループを使ってより良いものを書くことができましたが、私はLINQを使って試してみたかったのです。
public static String ChrTran(String input, String source, String destination)
{
return source.Aggregate(
input,
(current, symbol) => current.Replace(
symbol,
destination.ElementAtOrDefault(source.IndexOf(symbol))),
preResult => preResult.Replace("\0", String.Empty));
}
それを使用することができます。
// Returns "ThXs wXll be a es"
String output = ChrTran("This will be a test", "it", "X");
ただ、きれいな解決策持っている - LINQなしで同じことをして\0
例のために働いても、それが理由StringBuilder
を使用しての代わりにほとんどであるが、当然の入力を、変更されません。
public static String ChrTran(String input, String source, String destination)
{
StringBuilder result = new StringBuilder(input);
Int32 minLength = Math.Min(source.Length, destination.Length);
for (Int32 i = 0; i < minLength; i++)
{
result.Replace(source[i], destination[i]);
}
for (Int32 i = minLength; i < searchPattern.Length; i++)
{
result.Replace(source[i].ToString(), String.Empty);
}
return result.ToString();
}
null参照処理がありません。
tvanfossonのソリューションに触発されて、私はLINQに2回目のショットを与えました。
public static String ChrTran(String input, String source, String destination)
{
return new String(input.
Where(symbol =>
!source.Contains(symbol) ||
source.IndexOf(symbol) < destination.Length).
Select(symbol =>
source.Contains(symbol)
? destination[source.IndexOf(symbol)]
: symbol).
ToArray());
}
CHRTRANは奇妙なAPIです。 –
@ Greg D - あなたがFoxProで働いたことがない人のみ。私は、OracleのPL/SQLのTRANSLATEも同じように動作すると信じています。 –
またはメモリが使用されている場合はPerlのtr /// d演算子。 –