2012-01-06 45 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())); 
相关问题