2013-07-04 57 views
2

有很長的字符串被分隔符分隔。分隔符可以改變,但有一些固定的設置。我想提取分隔符來執行分割操作。從長字符串獲取分隔符以分割

String sLongName = "abc1234646;dfsdfsdfsdf44654654;asdfsdsdf;sadfsdfs446"; 

該組分隔符是{";" "," "/" "$"}

所以,我怎樣才能在運行時哪一個是上面的設置中使用的字符串

+0

你不能全部使用它們嗎? 'sLongName.Split(new string [] {「;」,「,」,「/」,「$」});' –

+0

我可以,但是到目前爲止,這個列表如果增加的話會很小,它會對性能造成任何影響。 .. – ankur

回答

4

你的意思是找到其中的分隔符的一個字符串中出現?

char[] delimiters = new char[] { ';', ',', '/', '$' }; 
char? usedDelimiter = delimiters.FirstOrDefault(d => sLongName.IndexOf(d) != -1); 

假設該字符串包含分隔符的只是一個(或無),你可以用隨後又被分割:

string[] splitString; 
if (usedDelimiter != null) 
    splitString = sLongName.Split(usedDelimiter.Value); 
else 
    splitString = new string[] { sLongName }; 
+0

如果OP關注的是性能,那麼就會比在所有有效的分隔符上調用split更糟!他們都是'O(n)',但這有一個更糟糕的常數! – jason

+0

@Jason:這取決於使用相應分隔符的頻率是否存在偏差。如果在90%的字符串中使用';'作爲分隔符,那麼在平均情況下,上述可能會執行得更快。 (是的,這是一個費力的理由;我的觀點是,這個問題並沒有真正提供關於性能要求的任何信息。) – Douglas

+0

評論並非針對你;你的答案很好。這是針對OP的,因爲他在他的評論中提出了表現問題。 – jason

1

是否有你不能只拆分在一切的原因分開的分隔符?

var fields = sLongName.Split(new string[] { ";", ",", "/", "$"}); 
+0

我發表了相同的評論。 – ankur

+0

@ankur:表現?非問題,幾乎肯定。不要猜測。測量。 – jason

2

您可以對所有的分隔符的分裂:

char[] delimiters = new char[] { ';',',','/','$' }; 
string[] parts = value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); 
0

假設,分隔符永遠不會「正常」的文本內使用,你可以

Char[] dels = new Char [] {';', ',', '/', '$'}; 
Char del='\0'; 
foreach (Char c in dels) 
    if (sLongName.IndexOf(c)>=0) 
    { 
     del=c; 
     break; 
    } 
if (del=='\0') throw new InvalidOperationException("I'm afraid, I can't do this, Chris!"); 
//del is now your delimiter.