レガシーPHPアプリケーションを.netに移行していますが、要件の1つは、URLが以前とまったく同じであるということです。
レガシーアプリケーションが使用するわかりやすいURLを生成するためstr_word_count
に、この関数のC#への移植があるかどうか疑問に思いました。
レガシーPHPアプリケーションを.netに移行していますが、要件の1つは、URLが以前とまったく同じであるということです。
レガシーアプリケーションが使用するわかりやすいURLを生成するためstr_word_count
に、この関数のC#への移植があるかどうか疑問に思いました。
これが私の「悪いC#」の例です(混合リターンタイプのPHPを模倣しています)。これは、.NETの正規表現を利用した非常に簡単な実装です。
private enum WORD_FORMAT
{
NUMBER = 0,
ARRAY = 1,
ASSOC = 2
};
private static object str_word_count(string str, WORD_FORMAT format, string charlist)
{
string wordchars = string.Format("{0}{1}", "a-z", Regex.Escape(charlist));
var words = Regex.Matches(str, string.Format("[{0}]+(?:[{0}'\\-]+[{0}])?", wordchars), RegexOptions.Compiled | RegexOptions.IgnoreCase);
if (format == WORD_FORMAT.ASSOC)
{
var assoc = new Dictionary<int, string>(words.Count);
foreach (Match m in words)
assoc.Add(m.Index, m.Value);
return assoc;
}
else if (format == WORD_FORMAT.ARRAY)
{
return words.Cast<Match>().Select(m => m.Value).ToArray();
}
else // default to number.
{
return words.Count;
}
}
したがって、関数は、Dictionary<int,string>
を選択した場合はa、選択した場合ASSOC
はa string[]
、を選択ARRAY
した場合はsimpleを返しint
ますNUMBER
。
例(PHPの例をここにコピーしました
static void Main(string[] args)
{
string sentence = @"Hello fri3nd, you're
looking good today!";
var assoc = (Dictionary<int,string>)str_word_count(sentence, WORD_FORMAT.ASSOC, string.Empty);
var array = (string[])str_word_count(sentence, WORD_FORMAT.ARRAY, string.Empty);
var number = (int)str_word_count(sentence, WORD_FORMAT.NUMBER, string.Empty);
//test the plain array
Console.WriteLine("Array\n(");
for (int i = 0; i < array.Length; i++)
Console.WriteLine("\t[{0}] => {1}", i, array[i]);
Console.WriteLine(")");
// test the associative
Console.WriteLine("Array\n(");
foreach (var kvp in assoc)
Console.WriteLine("\t[{0}] => {1}", kvp.Key, kvp.Value);
Console.WriteLine(")");
//test the charlist:
array = (string[])str_word_count(sentence, WORD_FORMAT.ARRAY, "àáãç3");
Console.WriteLine("Array\n(");
for (int i = 0; i < array.Length; i++)
Console.WriteLine("\t[{0}] => {1}", i, array[i]);
Console.WriteLine(")");
//test the number
Console.WriteLine("\n{0}", number);
Console.Read();
}
ただし、ここにメモを追加したいと思います。オブジェクトを返さないでください。強く型付けされた言語ではないため、PHPでも問題なく動作します。実際には、それぞれの異なる形式に対応するために、関数の個々のバージョンを作成する必要があります。とにかく、それはあなたが始めるはずです:)
出力:
Array
(
[0] => Hello
[1] => fri
[2] => nd
[3] => you're
[4] => looking
[5] => good
[6] => today
)
Array
(
[0] => Hello
[6] => fri
[10] => nd
[14] => you're
[25] => looking
[42] => good
[47] => today
)
Array
(
[0] => Hello
[1] => fri3nd
[2] => you're
[3] => looking
[4] => good
[5] => today
)
7