1

レガシーPHPアプリケーションを.netに移行していますが、要件の1つは、URLが以前とまったく同じであるということです。

レガシーアプリケーションが使用するわかりやすいURLを生成するためstr_word_countに、この関数のC#への移植があるかどうか疑問に思いました。

4

1 に答える 1

4

これが私の「悪い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
于 2012-08-23T18:41:17.690 に答える