我正在将一些代码从C#转换为VB.NET并遇到一个奇怪的问题。我有一个类,它将一个URls数组作为字符串,并根据给定的请求检查它们以构建路由。这是C#代码:
string requestedurl = httpContext.Request.AppRelativeCurrentExecutionfilePath;
if (urls.Contains(requestedurl, StringCompraer.OrdinalIgnoreCase)) {
//Do stuff
}
我已将其翻译成:
Dim requestedurl As String = httpContext.Request.AppRelativeCurrentExecutionFilePath
If urls.Contains(requestedurl, StringComparer.OrdinalIgnoreCase) = True Then
'Do stuff
End If
urls数组包含几个以'〜/'开头的字符串。并且要求的是'〜/'所以这应该是一个匹配。但是,上面的代码永远不会执行' do stuff'部分。
作为替代方案,我尝试了这个工作正常:
For Each url As String In urls
If url.ToLower.Contains(requestedurl.ToLower) = True Then
'Do stuff
Exit For
End If
Next
为什么第一个示例中的Contains扩展的功能与第二个中的String.Contains方法不同,是否有更好的方法来翻译它?
答案 0 :(得分:3)
“urls数组包含一些以'〜/'开头的字符串,而requesturl是'〜/',所以应该匹配。” - >不,它不应该。包含绝对匹配的检查,如果数组中的任何字符串包含该字符串,则不包含。数组上的Contains扩展方法只检查整个字符串,而不是字符串上的Contains方法,它检查字符串是否包含您正在查找的子字符串。这正是你的第二个例子的原因。
这将不输出任何内容:
string[] urls = { "bla", "~/something/some_folder", "ab", "cd", "~/some_file" };
string requestedUrl = "~/";
if (urls.Contains(requestedUrl, StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine("Check");
}
而这:
string[] urls = { "bla", "~/something/some_folder", "~/", "~/", "~/some_file" };
string requestedUrl = "~/";
if (urls.Contains(requestedUrl, StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine("Check");
}
将输出检查。如果这是您的1:1代码转换,则原件不起作用。
如果您想通过使用以下内容来避免循环,可以利用Linq来满足您的需求:
if (urls.Any(url => url.Contains(requestedUrl)))
{
Console.WriteLine("Check");
}
你必须自己转换到VB.Net,因为我不熟悉这种语言。