`
zu14
  • 浏览: 458885 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

你是否被C#/.Net的LastIndexOf 和 LastIndexOfAny 雷到过呢?

阅读更多

周末了,起得晚。爬起来,洗漱完毕打开电脑,习惯性的收MAIL,第一封就吸引了我,标题:

老兄,我发现了.NET里面string.LastIndexOfAny的一个逻辑性错误的BUG

我的第一反应: 这位兄弟又joking了 ,打开正文,一段再简单不过的代码:

string str = "+-这是一个综合使用确定子串位置的C#示例+-";

int iLastPos = str.LastIndexOfAny("+-".ToCharArray(), 0);
Console.WriteLine(iLastPos);

Console.ReadKey(true);
最后是问我,结果等于多少, 为什么?

我看了一下,然后就想当然的认为,这也太简单了,不就是最后一位嘛, str.Length – 1 呗! 不过,为了表示对这位兄弟的尊重,我还是运行了一下这个代码,显示的结果,让我大为surprise: 0

Why?   ,查之!!

LastIndexOfAny
报告在 Unicode 数组中指定的一个或多个字符在此实例中的最后一个匹配项的索引位置
Reports the index position of the last occurrence in this instance of one or more characters specified in a Unicode array.


重载1: String.LastIndexOfAny(char[] anyOf)
-------------------------------------------------------------------
参数
anyOf
    Unicode 字符数组,包含一个或多个要查找的字符。 
    A Unicode character array containing one or more characters to seek.

重载2:String.LastIndexOfAny ( char[] anyOf,  int startIndex)
------------------------------------------------------------------------------------
参数
anyOf
    Unicode 字符数组,包含一个或多个要查找的字符。 
   A Unicode character array containing one or more characters to seek. 

startIndex
    搜索起始位置。 
    The search starting position.

重载3: 和2类似,我就略掉了

返回值
此实例中最后一个匹配项的索引位置,在此位置找到 anyOf 中的任意字符;否则,如果未找到 anyOf 中的字符,则为 -1。
The index position of the last occurrence in this instance where any character in anyOf was found; otherwise, -1 if no character in anyOf was found.

备注

索引编号从零开始。
此方法从此实例的 startIndex 字符位置开始,从后向前进行搜索,直到找到 anyOf 中的一个字符或检查到第一个字符位置。该搜索区分大小写。
Index numbering starts from zero.
This method begins searching at the last character position of this instance and proceeds backward toward the beginning until either a character in anyOf is found or the first character position has been examined. The search is case-sensitive.

我上面加红的地方,是关键点,因为是 求LAST,所以逆向效率高,这是无可厚非的,问题就出在这里了,逆向搜索

重载2中,对startIndex 这个参数的说明是

startIndex
    搜索起始位置。 
    The search starting position

这就是说startIndex 是按正向的顺序来表示的,那就一目了然了,回到最初的问题:

string str = "+-这是一个综合使用确定子串位置的C#示例+-";

int iLastPos = str.LastIndexOfAny("+-".ToCharArray(), 0);
Console.WriteLine(iLastPos);

Console.ReadKey(true);

上面的代码中, 将 startIndex 设置为 0, 他的本意是搜索整个字符串!

但是因为 LastIndexOfAny 是逆向搜索的, 结果就成了 从 第一个 字符开始,向左搜索,结果就是匹配了第一个字符,返回了 0

如果要搜索整个字符串,正确的写法是

string str = "+-这是一个综合使用确定子串位置的C#示例+-";

int iLastPos = str.LastIndexOfAny("+-".ToCharArray(), str.Length - 1);
Console.WriteLine(iLastPos);

Console.ReadKey(true);

 

其实,如果看过 MSDN 上,关于 LastIndexOfAny 的那个sample的话,就一目了然了

LastIndexOf 和 LastIndexOfAny 是一样的逻辑,就不重复了

分享到:
评论

相关推荐

    C# asp.net 图片存进数据库二进制和读取

    ### C# ASP.NET 图片存进数据库二进制与读取 #### 一、概述 在Web开发中,经常需要处理图片数据。特别是在ASP.NET框架下,如何将用户上传的图片存储到数据库,并且能够在需要时正确地读取出来显示或进行其他操作,...

    asp.net的IndexOf,LastIndexOf,IndexOfAny和LastIndexOfAny的用法

    一、IndexOf/LastIndexOf IndexOf方法用于搜索在一个字符串中,某个特定的字符或者子串第一次出现的位置,该方法区分大小写,并从字符串的首字符开始以0计数。如果字符串中不包含这个字符或子串,则返回-1。常用的...

    c#与asp.net学习总结(基础)

    C#是一种面向对象的编程语言,专门为.NET框架设计,它具有强大的语法特性和丰富的类库。C#在ASP.NET中的应用主要在于构建Web应用程序。在C#的学习中,理解其核心概念至关重要。 首先,C#支持多种编程模型,如Code ...

    C#中String类的几个方法(IndexOf、LastIndexOf、Substring)

    通过以上介绍可以看出,`String.IndexOf`、`String.LastIndexOf` 和 `String.Substring` 是C#中处理字符串时非常重要的几个方法。它们可以帮助我们快速定位字符串中的字符或子字符串,以及从中提取特定的部分。掌握...

    C#上传下载c/s与b/s

    在C#编程中,文件上传和下载是常见的任务,尤其在客户端/服务器(C/S)和浏览器/服务器(B/S)架构中。本篇将详细解释如何使用C#实现这两种场景下的文件上传和下载功能。 首先,对于C/S模式,我们通常会创建一个...

    .NET技术总结

    - **C# 1.0/1.2**:这是C#的第一个正式版本,随.NET Framework 1.0和1.1一起发布。它主要关注于为.NET编程提供基础支持。 - **C# 2.0**:随着.NET Framework 2.0的发布,C# 2.0引入了对泛型的支持。此外,.NET ...

    ASP.NET 多关键字搜索类

    它提供了一套强大的工具和语言支持,包括C#和VB.NET,使得Web应用程序的开发更加高效和灵活。ASP.NET支持多种编程模型,如Web Forms、MVC(Model-View-Controller)和Web API,可以满足不同场景的需求。 ### 多...

    C#函数{文字处理}

    本主题聚焦于C#中的"文字处理",这是一个关键的子领域,涉及到字符和字符串的操作,这对于任何需要与用户界面交互或处理文本数据的应用程序来说都至关重要。 在C#中,文字处理主要依赖于`System.String`类,它提供...

    C#定时删除带日期的文件

    - `System.IO`命名空间:这是C#中用于处理文件和目录的基本库,提供了大量的类和方法来创建、读取、写入、移动和删除文件。 - `Directory.GetFiles()`:这个方法用于获取指定目录下匹配指定模式的所有文件。例如,...

    asp.net 查找文本

    通过这个例子,你可以看到在ASP.NET中如何结合C#的文本查找功能来实现一个简单的搜索功能。实际应用中,你可能需要根据业务需求,处理更复杂的场景,比如在数据库中查找、处理大量用户输入等。 总结来说,ASP.NET...

    C#获取图片并保存到本地

    根据提供的文件信息,本文将详细解释如何在C#中实现从网络上获取图片并将其保存到本地的方法。此过程涉及到了HTTP请求、流处理、文件操作等关键概念和技术。 ### 标题:“C#获取图片并保存到本地” 标题直接说明了...

    图片文件上传代码ASP.NET

    在本案例中,文件将被保存到服务器上的“upload”目录下。具体的保存逻辑如下所示: ```csharp this.File1.PostedFile.SaveAs(Server.MapPath("upload") + "\\" + filename); ``` 这里的关键点在于使用`Server....

    c# 文件搜索程序 源代码

    关于字符匹配,C#提供了多种内置函数,如`String.IndexOf()`和`String.LastIndexOf()`用于查找子字符串的位置,`String.Compare()`用于比较字符串,还有`String.Replace()`用于替换匹配的字符串。此外,`System.Text...

    asp.net地区文件上传查看

    在Visual Studio中打开这个项目,你可以看到项目的结构,包括ASP.NET页面、C#代码、Web.config配置文件等,通过这些文件可以更深入地理解和学习整个文件上传查看系统的实现。 总结来说,"asp.net地区文件上传查看...

    c# 加密和解密相关代码

    序中判断是否为数字的方法有很多种,可以使用正则表达式、int.Parse 方法和double.Parse 方法等。下面的代码 通过double.Parse 方法判断textBox1 文本框中的输入是否为数字。 double.Parse(textBox1.Text); 实例573 ...

    C#代码整理(字符串操作、加密解密、密码生成、cookie和缓存操作)

    在.NET框架中,C#是一种强大的编程语言,广泛应用于各种应用...通过LBC.Utility这个文件夹中的代码,你可以更深入地学习和理解这些C#编程技巧。在实际开发中,应结合具体需求,灵活运用这些方法和类,以达到最佳效果。

    .NET Framework 开发人员指南

    多文件程序集则是指将代码和资源拆分到多个文件中的程序集。 - **设置程序集属性**: - 程序集可以包含各种属性,如版本号、版权信息等,这些属性可以通过`AssemblyBuilder`类进行设置。 - **使用程序集和全局程序...

    C#字符串和正则表达式参考手册

    在编程领域,C#语言以其强大的功能和易用性深受开发者喜爱。特别是在处理文本操作时,字符串和正则表达式...通过深入阅读《C#字符串和正则表达式参考手册》,你将能够更全面地理解这两个主题,并将其运用到日常工作中。

    C#字符串操作

    ### C#字符串操作详解 #### 一、引言 在C#编程中,字符串操作是一项基本而重要的技能,尤其对于初学者来说更是如此。本文旨在详细介绍C#中的字符...通过本文的学习,你应该能够更好地理解和运用C#中的字符串处理技术。

Global site tag (gtag.js) - Google Analytics