为什么是.包含未按预期运行的内容

本文关键字:运行 包含未 为什么 | 更新日期: 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,因为我不熟悉这种语言。