为什么.Contains没有按预期运作?

时间:2014-11-11 09:46:16

标签: c# vb.net c#-to-vb.net

我正在将一些代码从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方法不同,是否有更好的方法来翻译它?

1 个答案:

答案 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,因为我不熟悉这种语言。