gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:26:17 25 4
gpt4 key购买 nike

我遇到了这个问题,其中 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);

}
}

最佳答案

同时 @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 时,由于 Ordinal 比较的性质,字符被视为不同。

另一种方法是使用 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 进行对比方法,默​​认情况下执行序数(区分大小写和文化in敏感)比较。这解释了为什么 Contains 返回 trueLastIndexOf 返回 false

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


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

关于c# - String.Contains 和 String.LastIndexOf C# 返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25614338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com