这是使用c#在字符串中跳过下划线(_)之前的字符的最佳方法

本文关键字:最佳 字符 下划线 方法 字符串 | 更新日期: 2023-09-27 18:10:38

这是在使用c#的字符串中跳过下划线_之前的字符的最佳方法?

eg:case 1 String contains _

string s="abc_defg" 

我想获取defg到另一个字符串

案例2

some times string不包含_。这时我需要得到所有字符串

s="defg"

在这两种情况下,我想得到"defg"。过滤仅在字符串中有下划线时应用。

这是使用c#在字符串中跳过下划线(_)之前的字符的最佳方法

string s="abc_defg";
int ix = s.IndexOf('_');
s = ix != -1 ? s.Substring(ix + 1) : s;

在这里使用三元操作符是毫无用处的,不如这样写:

s = s.Substring(ix + 1);
直接

,使用Substring可能针对case index == 0

进行了优化这一事实这是你想要的吗?

但是有人建议使用LINQ大炮,所以

var temp = s.SkipWhile(p => p != '_').Skip(1);
s = temp.Any() ? new string(temp.ToArray()) : s;

在。net 4.0中有一个新的string.Concat方法。

s = temp.Any() ? string.Concat(temp) : s;

(注意,通常LINQ方式更慢,更复杂的读取)

我将添加超级技巧:正则表达式!!有一种思想流派认为任何事情都可以用正则表达式或jQuery完成!: -)

var rx = new Regex("(?:[^_]*_)?(.*)", RegexOptions.Singleline);
var res = rx.Match(s).Groups[1].Value;

我甚至不会试图向任何人解释这个野兽,所以不要问。这是无用的。(包括Regex和to ask:-))

我不知道如何定义最好的方法,但只要只有一个下划线就可以。

string s1 = "abc_defg";
string s2 = "defg";
Console.WriteLine( s1.Split('_').Last() );
Console.WriteLine( s2.Split('_').Last() );

如果你需要更多的灵活性,你可以看看正则表达式

Regex.Replace(s1, "^.*_", "")

简单函数或许:

public string TakeStringAfterUnderscoreOrWholeString(string  input)
{
   var underscorePos = input.IndexOf("_");
   return underscorePos  == -1 ? input : input.Substring(underscorePos+1);
}

实时测试:http://rextester.com/rundotnet?code=AVQO61388

您可以使用LINQ SkipWhile():

textValue.SkipWhile(c => c != separator)
         .Skip(1)

两种情况的最终解:

string textValue = "abc_defg";
char separator = '_';
string result = textValue.IndexOf(separator) >= 0 
                ? new String(textValue.SkipWhile(c => c != separator)
                                      .Skip(1)
                                      .ToArray())
                : textValue;
编辑:

我对xanatos的评论是正确的,但无论如何,有时找到不同的解决方案是很有趣的:)

我建议简单地使用string[] arr和split函数。

string[] arr=s.split('_');
string out=arr[arr.Length-1];