2011-10-06 17 views
4

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

如:情况1字符串包含_

string s="abc_defg" 

我想DEFG到另一个字符串

情况下2

有时串不包含_。那时我需要得到全部字符串

例如。

s="defg" 

在这两种情况下,我想得到“defg”。仅当字符串中存在下划线时才应用过滤。我怎样才能做到这一点

+1

你试过了什么? – Oded

+0

@Null指针你也可以使用String.Split – 2011-10-06 10:21:36

回答

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

这里使用三元运算符是相当无用,不如写:

s = s.Substring(ix + 1); 

直接使用Substring可能是为案件索引== 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的方法是比较慢和更复杂的阅读)

我将添加ultrakill:正则表达式!有一种思想,任何事情都可以用正则表达式或jQuery来完成! :-)

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

我甚至不会试图向任何人解释这个野兽,所以不要问。没用的。(无论是正则表达式,并要求:-))

+2

嘿,为什么你使用我的大炮? ;) – sll

+1

@sll因为我的空间没有加载:-) – xanatos

2

您可以利用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; 

编辑:

我与萨那托斯意见是对的,但无论如何,有时找到不同的解决方案是非常有趣:)

+1

+1,因为在这里使用LINQ就像使用cannons来对抗昆虫... :-) – xanatos

+0

@xanatos:放轻松;)LINQ代码看起来不错; – sll

+0

@ xanatos:这很明显,LINQ不返回字符串,我相信OP知道如何将IEnumerable 转换成字符串 – sll

2

简单的功能也许是:

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

现场测试:http://rextester.com/rundotnet?code=AVQO61388

6

我不知道如何定义的最佳方式,但长期这样工作方式为只有一个下划线。

string s1 = "abc_defg"; 
string s2 = "defg"; 

Console.WriteLine(s1.Split('_').Last()); 
Console.WriteLine(s2.Split('_').Last()); 

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

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

我会建议简单地使用一个字符串[] ARR和分裂功能为此目的。

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

感谢您的回答。但这个问题已经回答了。而且如果字符串中有多个下划线?感谢无论如何:) –

+0

在这种情况下如何做你期望的输出是...例如“qwe_etr_uit”应该是什么输出? – iJade

+0

在这种情况下,结果应该是etr_ui。他杰伊,我已经用其他答案:D。所以已经解决了这个问题,我答复了答案。谢谢你的努力 –

相关问题