16

私はToken Replacement and Identificationからの解決策を見ています:

string result = Regex.Replace(
    text,
    @"\[%RC:(\d+)%\]",
    match => dict[int.Parse(match.Groups[1].Value)]);

そして、 がどのように過負荷になったのか理解できませんMatchEvaluator

ラムダ式の一部を理解しています。入力matchを受け取り、辞書から整数を検索しますか?

しかし、の値はmatchどこから来るのでしょうか? そして、返された値はどこにmatch => dict[int.Parse(match.Groups[1].Value)]);行くのですか?

編集:あなたの何人かは言及しDelegateました。驚いたことに、CS の大学で 3 年間過ごした後、私はこの用語に出くわしませんでした。この特定の状況で は何をDelegateし、何をしますか?

最後の編集:次のコードで独自のデリゲートを作成しようとしました。私のトークンは次の形式です[@someTokenName]

public void CreateScript(Dictionary<string,string> dictionary, string path)
    {
        //used in the regex to identify the string to replace
        var pattern = @"\[@[0-9a-fA-F]+\]";
        //read in the file found at the path
        var lines = File.ReadAllLines(path);
        int lineCounter = 0;
        foreach (string line in lines)
        {
            line = Regex.Replace(line, pattern, match => dictionary.TryGetValue((match.Groups[0].Value)));
        }

しかし、デリゲート型ではないため、「ラムダ式を型 'int' に変換できません」というメッセージが表示され続けます。私が書いた行とソリューションで見つかった行の違いは何ですか?

4

4 に答える 4

7

想像:

string result = Regex.Replace(
text,
@"\[%RC:(\d+)%\]",
lambda);

//public delegate string MatchEvaluator(Match match)
string lambda(Match match) {
   return dict[int.Parse(match.Groups[1].Value)]); 
}

ラムダ式は と同じ型MatchEvaluatorです: の値matchは正規表現から取得され (ラムダ式が通常のデリゲートとして定義されているかのように)、ラムダ式が返す値は に割り当てられますresult。通常のデリゲートとして定義されました。

于 2013-05-21T19:11:22.543 に答える
5

平易な英語で:

式に一致するすべてのグループについて、1 の値のインデックスでグループを使用し、値を として解析し、intそれをインデクサー/キーとして使用して、dictionary object呼び出さdictれた から値を取得し、置換の新しい値として使用します。

ラムダは、一致を引数として使用し、引数のコンテキストで本体を実行する無名関数です。

于 2013-05-21T19:07:04.703 に答える