为什么是.包含未按预期运行的内容
本文关键字:运行 包含未 为什么 | 更新日期: 2023-09-27 18:29:56
我正在将一些代码从C#翻译到VB.NET,但遇到了一个奇怪的问题。我有一个类,它将URL数组作为字符串,并根据给定的请求对它们进行检查,以构建路由。这是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数组包含两个以"~/"开头的字符串,requestedurl为"~~",因此应该匹配。然而,上面的代码从来没有执行"做东西"部分。
作为一种替代方案,我尝试了这个效果很好:
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方法不同?有更好的方法来翻译吗?
"urls数组包含两个以'~/'开头的字符串,requestedurl是'~/],所以应该匹配。"->不应该。包含对绝对匹配的检查,如果数组中的任何字符串包含该字符串,则不包含该检查。数组上的Contains扩展方法只检查整个字符串,而字符串上的Contines方法则检查字符串是否包含您要查找的子字符串。这正是第二个例子有效的原因。
这将不输出任何内容:
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,因为我不熟悉这种语言。