从此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++) + "}");
}
答
通过使用拉姆达以及局部变量命中,C#将创建一个封闭:
将足以
命中变量被封装在lambda封闭,并都将拉姆达呼叫内可以重复使用,但将明显好ConvertSdsFileMaskToStringMask调用。
+0
非常相当于Skeet的。尽管只能给出一个帖子的答案。 – 2009-02-12 11:29:45
啊哈!第一次,整个++点击vs点击++的东西进场:) 没想到lambda的。大! – 2009-02-12 11:28:32