我尝试使用IndexOf简化一些遗留代码,以从行中检索GUID。我可以进一步简化下面的代码,以摆脱使用guids.Any和guids.First?
<body>
<div class="container">
<div class="buttonContainer"><center>
<button class='button'><b>LOGIN</b></button>
<button class='button button1' disabled>OR</button>
<button class='button'><b>SIGNUP</b></button></center>
</div>
</div>
</body>
在编译的示例中给出的遗留代码下面:
// Code using regular expression
private static string RetrieveGUID2(string[] lines)
{
string guid = null;
foreach (var line in lines)
{
var guids = Regex.Matches(line, @"[{(]?[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?")
.Cast<Match>().Select(m => m.Value);
if (guids.Any())
{
guid = guids.First();
break;
}
}
return guid;
}
答案 0 :(得分:4)
是的,你可以。因为您只返回正则表达式的第一个匹配项,您可以使用Regex.Match
而不是Regex.Matches
。
private static string RetrieveGUID2(string[] lines)
{
foreach (var line in lines)
{
var match = Regex.Match(line, @"[{(]?[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?");
if (match.Success)
return match.Value;
}
return null;
}
答案 1 :(得分:1)
使用foreach(var nextGuid in guids) { guid = nextGuid; break; }
循环,该循环在第一次迭代时突破 - 这实际上是First
和FirstOrDefault
实现的方式
FirstOrDefault
进一步简化,您可以使用return Regex
.Matches(line, @"[{(]?[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?")
.Cast<Match>()
.Select(m => m.Value)
.FirstOrDefault();
,如果没有对象则不会抛出错误
import time
from gopigo import * # Has the basic functions for controlling the GoPiGo Robot
import sys # Used for closing the running program
now = time.time()
future = now + 0.500
while time.time() < future:
bwd() # Move backward
stop()
sys.exit()
答案 2 :(得分:1)
只是使用Guid.TryParse()
提供替代方案:
public static Guid? RetrieveGuid(IEnumerable<string> lines)
{
Guid? parseGuid(string text) => Guid.TryParse(text, out Guid guid) ? (Guid?) guid : null;
return lines.Select(parseGuid).FirstOrDefault(guid => guid != null);
}
或等效地:
public static Guid? RetrieveGuid(IEnumerable<string> lines)
{
return lines.Select(line => Guid.TryParse(line, out Guid guid) ? (Guid?)guid : null)
.FirstOrDefault(guid => guid != null);
}
这会返回Guid?
而不是字符串,null
的结果表示没有解析有效的Guid。