2012-01-06 68 views
1

我哈瓦一個字符串是這樣的:如何將八個字符的字符串分成四個變量?

var id = "01020304"; 

有一個簡單的辦法可以分成四個變量稱爲PR,PA這一點,FO,其每一個變量都需要有字符串的兩個字符。尋找一個優雅的解決方案,如果它存在。

+2

如果你告訴我們什麼名字PR, pa,fo和它的意思是,我們可以給你一個更多的語義含義的答案! – 2012-01-06 11:52:36

+0

嘗試使用子串,但我知道這裏有一些聰明的人總是想出一些很棒的解決方案。每個人都樂意幫忙。 – 2012-01-06 12:03:01

+0

當有4個不同的變量(而不是數組或類似的)時,怎麼會比4個獨立的子字符調用更好? – 2012-01-06 12:04:51

回答

5

既然你有四個不同的變量,你不能得到比使用子串更優雅:

var pr = id.Substring(0, 2); 
var pa = id.Substring(2, 2); 
var fo = id.Substring(4, 2); 
var it = id.Substring(6); 

你找四個數組2個字符的子串,你可能會發現:

var parts = new string[4]; 
for (int i = 0 ; i != parts.Length ; i ++) { 
    parts[i] = id.Substring(2*i, 2); 
} 

編輯:同樣可以用LINQ表達式來實現:

var parts = Enumerable 
    .Range(0, id.Length/2) 
    .Select(i => x.Substring(2*i, 2)) 
    .ToArray(); 
+1

我相信你的循環構造也可以使用一個聰明的LINQ查詢來完成...... – Oded 2012-01-06 11:52:40

+2

@Oded你可能是對的。但是如果你不能沒有想到地寫這個構造的LINQ,我敢打賭它太過於花哨,不能保持可讀性。:) – dasblinkenlight 2012-01-06 11:57:44

+0

絕對不是 - 我不喜歡寫作或閱讀。 – Oded 2012-01-06 12:01:15

6

您可以使用Substring

pr = id.Substring(0, 2); 
pa = id.Substring(2, 2); 
fo = id.Substring(4, 2); 
it = id.Substring(6, 2); 
4

如果你總是將有8個字符的輸入,並總是需要4個變量,你可以簡單地拆分與Substring(...)方法的字符串:

var id = "01020304"; 
string pr = id.Substring(0, 2); 
string pa = id.Substring(2, 2); 
string fo = id.Substring(4, 2); 
string it = id.Substring(6, 2); 

否則,您可以使用通過for循環和分裂關閉兩個角色在同一時間運行的方法。

3

這是一個帶環,這將支持這種格式,任何長度的字符串的溶液:

string id = "01020304"; 
int length = id.Length; 

int[] holder = new int[length/2]; 

for (int i = 0; i < length/2; i++) { 
    holder[i] = id.Substring(i*2, 2); 
} 
+0

這是否適用於奇數長度的字符串? – AidanO 2012-01-06 14:44:34

+0

使用奇數長度的字符串時,最終字符將被忽略。 – Tom 2012-01-06 15:07:51

5

嘗試正則表達式。

var id = "01020304"; 
string pat = "(?:(\\d{2}))"; 

var result = Regex.Split(id, pat).Where(p=>p!=string.Empty); 
foreach (var t in result) 
{ 
    Console.WriteLine(t); 
} 
1

這是一個使用Linq的版本。

有趣的是,只用內置的運算符就不那麼容易實現。下面的版本只使用LINQ的擴展方法來與NET框架:

var result = "01020304".ToCharArray(). 
      Select((c,i) => new { idx = i % 2 == 1 ? i - 1 : i, ch = c }). 
      GroupBy(e => e.idx, 
       (k,g) => new String(g.Select(e => e.ch).ToArray())); 

如果使用morelinq Extensions查詢可以簡化爲

var result = "01020304".ToCharArray(). 
        Batch(2).Select(ca => new String(ca.ToArray())); 
相關問題