从此MatchEvaluator中删除静态int

问题描述:

我试图将专有字符串掩码转换为.net等效的。 为此,我需要用{aDigit}来交换每个[someText]的出现。从此MatchEvaluator中删除静态int

private static int hits = 0; 
private static object hitsLock = new object(); 

public static string ConvertSdsFileMaskToStringMask(string sdsFileMaskString) { 
    Regex bracketsExpression = new Regex(@"\[[^[]*]"); 
    lock (hitsLock) 
    { 
     hits = 0; 
     return bracketsExpression.Replace(sdsFileMaskString, ReplaceSquareWithAngularBrackets); 
    } 
} 
private static string ReplaceSquareWithAngularBrackets(Match m) { 
    string result = String.Format("{{{0}}}", hits.ToString()); 
    hits++; 
    return result; 
} 

它的工作原理。但是这两种表达方式都需要了解对方的工作方式,并且取决于点击率。我觉得这可以改进。理想情况下,两者都不相互依赖。有什么建议么? 这可能可以做得更好。有什么建议么?

是 - 使用匿名方法或lambda表达式:

public static string ConvertSdsFileMaskToStringMask(string sdsFileMaskString) 
{ 
    Regex bracketsExpression = new Regex(@"\[[^[]*]"); 
    int hits = 0; 
    return bracketsExpression.Replace(sdsFileMaskString, match => 
    { 
     string result = String.Format("{{{0}}}", hits.ToString()); 
     hits++; 
     return result;  
    }); 
} 

这将捕获在本地变量新的(编译器生成的)型,摆脱“globalness”的。

如果您对副作用感到满意,您也可以使lambda表达式更简单。我也想摆脱调用到的String.Format在这种情况下,所有这些括号是令人困惑:

public static string ConvertSdsFileMaskToStringMask(string sdsFileMaskString) 
{ 
    Regex bracketsExpression = new Regex(@"\[[^[]*]"); 
    int hits = 0; 
    return bracketsExpression.Replace(sdsFileMaskString, 
     match => "{" + (hits++) + "}"); 
} 
+0

啊哈!第一次,整个++点击vs点击++的东西进场:) 没想到lambda的。大! – 2009-02-12 11:28:32

通过使用拉姆达以及局部变量命中,C#将创建一个封闭:

​​

将足以

命中变量被封装在lambda封闭,并都将拉姆达呼叫内可以重复使用,但将明显好ConvertSdsFileMaskToStringMask调用。

+0

非常相当于Skeet的。尽管只能给出一个帖子的答案。 – 2009-02-12 11:29:45