获取C#字符串中第一个非空白字符的索引C#中的字符串非空白字符的索引(或更一般地,匹配条件的第一个字符的索引)而不编写我自己的循环代码?编辑通过“编写我自己的循环代码”,我的意思是我正在寻找一个紧凑的表达式来解决问题,而不会弄乱我正在处理的逻辑。对于此时的任何混乱,我深表歉意。我喜欢定义自己的扩展方法,该方法返回满足自定义谓词的序列中第一个元素的索引。//////返回序列中第一个元素的索引///满足条件。/////////的元素类型。/////////一个包含要应用谓词的元素的///。/////////用于测试每个元素的条件的函数。////////////返回的第一个元素的从零开始的索引位置;///or-1ifisempty///ornoelementsatisfiedthecondition.///publicstaticintIndexOf(thisIEnumerablesource,Funcpredicate){inti=0;foreach(源中的TSource元素){if(predicate(element))returni;我++;}返回-1;}然后,您可以使用LINQ解决原始问题:stringstr="HelloWorld";inti=str.IndexOf(c=>!char.IsWhiteSpace(c));字符串当然是IEnumerable所以你可以使用Linq:intoffset=someString.TakeWhile(c=>char.IsWhiteSpace(c)).Count();strings="t测试";Array.FindIndex(s.ToCharArray(),x=>!char.IsWhiteSpace(x));返回6添加条件就是……Array.FindIndex(s.ToCharArray(),x=>!char.IsWhiteSpace(x)&&你的条件);varmatch=Regex.Match("ttest",@"S");//S表示所有不是空白的字符if(match.Success){intindex=match.Index;//用索引做一些事情}else{//没有非空白字符,适当处理}如果你经常这样做,出于性能原因,你应该使用这种模式缓存编译的正则表达式,例如:staticreadonlyRegexnonWhitespace=new正则表达式(@“S”);然后像这样使用它:nonWhitespace.Match("ttest");您可以使用String.IndexOfAny函数,它返回指定的Unicode字符数组中任何字符的第一个出现位置,或者,您可以使用String.TrimStart函数从字符串的开头删除所有空白字符。第一个非空格字符的索引是原始字符串和修剪后的字符串的长度之差。您甚至可以选择一组字符进行修剪:)基本上,如果您正在寻找一组有限的字符(比方说数字),您应该使用第一种方法。如果您试图忽略一组有限的字符(例如空格),则应使用第二种方法。最后一种方式是使用Linq方法:strings="qsdmlkqmlsdkm";Console.WriteLine(s.TrimStart());Console.WriteLine(s.Length-s.TrimStart().Length);Console.WriteLine(s.FirstOrDefault(c=>!Char.IsWhiteSpace(c)));Console.WriteLine(s.IndexOf(s.FirstOrDefault(c=>!Char.IsWhiteSpace(c))));输出:qsdmlkqmlsdkm8q8您可以修剪,获取第一个字符并使用IndexOf。由于这里有多种解决方案,我决定进行一些性能测试以了解每种解决方案的性能。决定与感兴趣的人分享这些结果...intiterations=1000000;整数结果=0;strings="t测试";System.Diagnostics.Stopwatchwatch=newStopwatch();//转换为char数组并使用FindIndexwatch.Start();对于(inti=0;i!char.IsWhiteSpace(x));观看。停止();Console.WriteLine("转换为char数组并使用FindIndex:"+watch.ElapsedMilliseconds);//修剪空格并获取第一个字符的索引watch.Restart();for(inti=0;i(c=>!char.IsWhiteSpace(c));watch.Stop();Console.WriteLine("使用扩展方法:"+watch.ElapsedMilliseconds);//循环watch.Restart();for(inti=0;iresultinmilliseconds....wheres="ttest"converttochararrayandtrimwithFindIndex:154Spacesandgetindexoffirstcharacter:189使用扩展方法:234循环:146wheres="test"转换为char数组并使用FindIndex:39修剪空格并获取第一个字符的索引:155使用扩展方法:57Loop:15wheres=(1000strings,nospaces)转换为char数组并使用FindIndex:506trimspacesandgetindexoffirstchar:534useextensionmethod:51loop:15wheres=(1000stringsstartwith"tTest")转换为字符数组并使用FindIndex:609Trimspacesandgetindexoffirst字符:1103使用扩展方法:226循环:146得出自己的结论,但我的结论是使用你最喜欢的那个,因为在现实世界的场景中,性能差异是微不足道的有一个非常简单的解决方案stringtest="helloworld";intpos=test.ToList().FindIndex(x=>char.IsWhiteSpace(x)==false);pos将为4你可以有更复杂的条件,如:pos=test.ToList().FindIndex((x)=>{if(x=='s')//你的复杂条件在这里returntrue;elsereturnfalse;});是的,你可以试试这个:stringstg="xyz";intindx=(stg.Length-stg.Trim().Length);有些东西会在某处循环。为了完全控制什么是空白,您可以使用linq循环对象:intindex=Array.FindIndex(s.ToCharArray(),x=>!(new[]{'t','r','n',''}.Any(c=>c==x)));这里有很多将字符串转换为数组的解决方案。这不是必需的,可以像访问数组中的项一样访问字符串中的单个字符。这是我的解决方案,应该可以完美运行:privatestaticintFirstNonMatch(strings,Funcpredicate,intstartPosition=0){for(vari=startPosition;ipredicate,intstartPosition){for(vari=startPosition;i>=0;i--)if(!predicate(s[i]))返回i;返回-1;}要用到这些:非空字符索引分享的全部内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—varx=FirstNonMatch("asdf",字符.IsWhiteSpace);vary=LastNonMatch("asdf",char.IsWhiteSpace,"asdf".Length);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
