如果您决定将此代码放入编译器中,您会注意到Implicitly-typed local variables must be initlialized
上出现var match
错误。但我不太确定如何以任何其他方式进行此检查(对于text.count())。有时候我的OCR会丢失一个字母或其他内容,如果有的话,字符数会减少,这会使match
变量返回null ...让我没有结果。
此外,对于奖励积分,任何可以帮助清理我的REGEX表达的人都很好......我刚开始使用它并且我在语义方面还不太熟练。
var match;
if (wordList[i].Text.Count() < 12)
{
match = Regex.Match(wordList[i].Text, @"c[:;i]ty[!l1;:i/][5s][tuj!l/]z[i;:l]p[c1:;zs]", RegexOptions.IgnoreCase);
}
else
{
match = Regex.Match(wordList[i].Text, @"c[:;i]ty[!l1;:i/][5s][tuj!l/][f!l1j;:i/]z[i;:l]p[c1:;zs]", RegexOptions.IgnoreCase);
}
if (match.Success)
{ ... }
答案 0 :(得分:3)
如果没有初始化,则无法声明var
。使用
Match match;
或者,如果你真的必须,
dynamic match;//I don't recommend this
答案 1 :(得分:0)
请查看doc。
从Visual C#3.0开始,在方法中声明的变量 scope可以有一个隐式类型var。隐式键入的本地 变量是强类型的,就像你声明了类型一样 你自己,但编译器确定了类型。
声明变量时,需要使用显式键入方式,或执行
var match = new Match();
答案 2 :(得分:0)
你必须给编译器一些东西,以便它可以推断出类型是什么。例如,这将起作用:
var match = (Match)null;
因为编译器知道var
应该是Match
。
为什么你想在Match match;
之上做这件事是超出我的,但它确实有效。
答案 3 :(得分:0)
在不查看正则表达式模式的情况下,我建议您可以通过将“模式决策逻辑”与其余代码分开来破坏代码。
下面我提供了2个单独的例子来说明如何解决这个问题。第一个定义了一个DeterminePattern
方法,它只返回要用作正则表达式模式的字符串。第二个定义了一个FindMatch
方法,它返回相应的Match对象。
从技术上讲,其中任何一个都允许你继续使用var关键字,但在我看来,这并不是那么重要......正如我所看到的,这里的好处是让代码更易于阅读和理解。你可以自己决定是否打破这样的代码。
示例1
private static string DeterminePattern(string input)
{
if (input.Count() < 12)
{
return @"...";
}
return @"...";
}
var match = Regex.Match(wordList[i].Text, DeterminePattern(wordList[i].Text), RegexOptions.IgnoreCase);
if (match.Success)
{ ... }
示例2
private static Match FindMatch(string input)
{
if (input.Count() < 12)
{
return Regex.Match(input, @"...", RegexOptions.IgnoreCase);
}
return Regex.Match(input, @"...", RegexOptions.IgnoreCase);
}
var match = FindMatch(wordList[i].Text);
if (match.Success)
{ ... }
答案 4 :(得分:0)
保持 DRY :不要重复自己。
如果你必须使用var
(即使你不这样做:特别是在这种情况下使用var
是什么意思?),这个结构更好:
string text = wordList[i].Text ;
string pattern = text.Length < 12
? @"c[:;i]ty[!l1;:i/][5s][tuj!l/]z[i;:l]p[c1:;zs]"
: @"c[:;i]ty[!l1;:i/][5s][tuj!l/][f!l1j;:i/]z[i;:l]p[c1:;zs]"
;
Match match = Regex.Match( text , pattern , RegexOptions.IgnoreCase ) ;
或者,更好的是:
string text = wordList[i].Text ;
Regex rx = text.Length < 12 ? Regex1 : Regex2 ;
Match match = rx.Match( text , pattern , RegexOptions.IgnoreCase ) ;
.
.
.
private static readonly Regex1 = new Regex( @"c[:;i]ty[!l1;:i/][5s][tuj!l/]z[i;:l]p[c1:;zs]" , RegexOptions.IgnoreCase ) ;
private static readonly Regex2 = new Regex( @"c[:;i]ty[!l1;:i/][5s][tuj!l/][f!l1j;:i/]z[i;:l]p[c1:;zs]" , RegexOptions.IgnoreCase ) ;
为什么你在使用Linq(Wordlist[i].Text.Count()
)来获取字符串的长度呢?字符串已经知道长度。没有必要迭代它来计算字符:只需通过查询其Length
属性来询问字符串多长时间。