String.Contains和String.LastIndexOf C#返回不同的结果?

use*_*150 5 c# contains lastindexof

我有这个问题,String.Contains返回true,String.LastIndexOf返回-1.有人可以向我解释发生了什么吗?我使用的是.NET 4.5.

    static void Main(string[] args)
    {
        String wikiPageUrl = @"http://it.wikipedia.org/wiki/?Abd_All?h_al-Sall?l";

        if (wikiPageUrl.Contains("wikipedia.org/wiki/"))
        {

            int i = wikiPageUrl.LastIndexOf("wikipedia.org/wiki/");

            Console.WriteLine(i);

        }
    }
Run Code Online (Sandbox Code Playgroud)

And*_*ker 5

虽然@ sa_ddam213的答案肯定能解决问题,但它可能有助于准确理解这个特定字符串发生了什么.

如果您尝试使用其他"特殊字符"的示例,则不会显示该问题.例如,以下字符串按预期工作:

string url1 = @"http://it.wikipedia.org/wiki/»Abd_All?h_al-Sall?l";
Console.WriteLine(url1.LastIndexOf("it.wikipedia.org/wiki/")); // 7

string url2 = @"http://it.wikipedia.org/wiki/~Abd_All?h_al-Sall?l";
Console.WriteLine(url2.LastIndexOf("it.wikipedia.org/wiki/")); // 7
Run Code Online (Sandbox Code Playgroud)

有问题的字符"'"称为间距修饰符字母 1.间距修饰符不单独存在,而是修改字符串中的前一个字符,本例为"/".另一种方法是在渲染时不占用自己的空间.

LastIndexOf,在没有StringComparison参数的情况下调用时,使用当前文化比较字符串.

当以文化敏感的方式比较字符串时,"/"和"'"字符不会被视为两个不同的字符 - 它们被处理成一个字符,传入的参数不匹配LastIndexOf.

当你传递StringComparison.OrdinalLastIndexOf的字符被视为不同,由于序号比较的性质.

另一种方法是使用CompareInfo.LastIndexOf和提供CompareOptions.IgnoreNonSpace选项:

Console.WriteLine(
    CultureInfo.CurrentCulture.CompareInfo.LastIndexOf(
        wikiPageUrl, @"it.wikipedia.org/wiki/", CompareOptions.IgnoreNonSpace));
// 7
Run Code Online (Sandbox Code Playgroud)

这里我们说我们不希望在字符串比较中包含组合字符.

作为旁注,这意味着@Patha 的回答@Noctis的回答只能起作用,因为该字符被应用于未传递给搜索字符串的字符LastIndexOf.

与此对比Contains的方法,其通过默认执行序(区分大小写和培养比较敏感).这解释了为什么Contains返回trueLastIndexOf返回false.

有关如何在.NET框架中操作字符串的精彩概述,请查看本文.


1:这与组合字符不同还是一种组合字符?如果有人愿意为我清除,我将不胜感激.


sa_*_*213 3

尝试使用StringComparison.Ordinal

\n\n

这将通过评估每个中string对应的数值来进行比较,这应该适用于该示例中的特殊内容charsstringcharsstring

\n\n
 string wikiPageUrl = @"http://it.wikipedia.org/wiki/\xca\xbfAbd_All\xc4\x81h_al-Sall\xc4\x81l";\n int i = wikiPageUrl.LastIndexOf("http://it.wikipedia.org/wiki/", StringComparison.Ordinal);\n
Run Code Online (Sandbox Code Playgroud)\n\n

// 返回 0;

\n