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

时间:2014-09-02 00:36:20

标签: 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);

        }
    }

4 个答案:

答案 0 :(得分:5)

虽然@sa_ddam213's answer肯定能解决问题,但它可能有助于准确理解这个特定字符串的内容。

如果您尝试使用其他“特殊字符”的示例,则不会出现问题。例如,以下字符串按预期工作:

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

有问题的人物“'”被称为spacing modifier letter 1 。间距修饰符字母不能单独使用,而是修改字符串中的 previous 字符,本例为“/”。另一种说法就是它在渲染时不会占用自己的空间。

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

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

当您将StringComparison.Ordinal传递给LastIndexOf时,由于序数比较的性质,字符会被视为不同。

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

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

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

作为旁注,这意味着@Partha's answer@Noctis' answer仅起作用,因为该字符被应用于未出现在传递给LastIndexOf的搜索字符串中的字符。

将此与Contains方法进行对比,该方法默认执行Ordinal(区分大小写和敏感的)比较。这解释了为什么Contains返回trueLastIndexOf返回false

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


1 :这是否与组合字符不同,还是一种组合字符?如果有人愿意为我解决这个问题,我将不胜感激。

答案 1 :(得分:3)

尝试使用StringComparison.Ordinal

这将通过评估每个string中相应chars的数值来比较string,这应该与您在该示例中使用的特殊chars一致{ {1}}

string

//返回0;

答案 2 :(得分:2)

事情是C#lastindexof从后面看。

wikipedia.org/wiki/之后是',它作为转义序列。因此,要么'之后删除wiki/,要么@删除。

以下语法将起作用(任何人)

string wikiPageUrl = @"http://it.wikipedia.org/wiki/Abd_Allāh_al-Sallāl";

string wikiPageUrl = @"http://it.wikipedia.org/wiki/@ʿAbd_Allāh_al-Sallāl";

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

所有3个作品

如果您需要针对此问题的通用解决方案,请在执行任何操作之前将'替换为字符串中的@'

答案 3 :(得分:0)

'个字符将其抛弃。

当您将'作为\'转义

时,这应该有用
wikiPageUrl = @"http://it.wikipedia.org/wiki/\'Abd_Allāh_al-Sallāl";

if (wikiPageUrl.Contains("wikipedia.org/wiki/"))
{
    "contains".Dump();
  int i = wikiPageUrl.LastIndexOf("wikipedia.org/wiki/");

  Console.WriteLine(i);

}

弄清楚你想做什么(删除',逃避它,或深入挖掘:))。