首页 > 技术文章 > 字符串按长度转换成数组

luohongwei 2016-08-01 16:44 原文

今天群里人突然发问形如var s = "abcdefghijklmn"; 有什么简单的办法分组字符串?

第一想到的肯定是字符串分割split,但是这个貌似和我们平常用的区别很大呀,没有单字符做截取依据嘛。去查找发现有个Regex.Split方法,噢~貌似这个可以做到哦。

Ok,我们查看下Regex.Split提供了2个重载方法,这个我们用三个参数的重载方法,其实主要的就是这里的正则写法直接给出不多做解释了(?<=\G.{3})

List<string> str2 = new List<string>(Regex.Split(str, @"(?<=\G.{3})", RegexOptions.Singleline));

(3是指 33分组,下面的都是一样的)

同样的逻辑我们可以想到通过正则可以匹配所有的字符串出来,Regex.Matches(input,pattern) ,但是这个返回的是MatchCollection 集合,ok 一样的利用linq我们来取出数据

var str2=(from Match m in Regex.Matches(str, @"\w{1,3}")
                        select m.Value).ToList()

 

既然linq 我们都用的这么多了,那linq里的Enumerable 应该或多或少接触了那么一些,像Repeat、Reverse等等这些确实提供了我们诸多的方便,刚开始立马想到了累加器的使用Aggregate((m,n)=>{//do something}),像在每个组的字符串后面增加一个

‘,’分隔符然后split一下的,后来也就放弃了,看到老外有个用skip来截取然后转化成数组的也挺好,遂稍微改了一下直接贴上来供大家参考

double chunkSize = 3;
var str2 = Enumerable.Range(0, (int)Math.Ceiling(str.Length / chunkSize))
        .Select(i => new string(str.Skip(i * (int)chunkSize).Take((int)chunkSize).ToArray()));

说实话本人不建议这种写法,代码太多,里面又掺杂类型转换。

 

最后一种说实话 我都没接触过,这个也是看老外写的,用了第三方的类库Morelinq,morelinq里面提供了一个batch方法可以很容易的做到这些

var str2=str.Batch(3, chars => new String(chars.ToArray()));

这个实在是太简洁了,唯一的缺憾就是引入了第三方的类库,也不推荐。

以上共4种方法,从个人角度来看,推荐大家使用正则,及上图中的第三种,其他三种方法不是引入了第三方类库,就是代码方法太生僻,希望能给大家带来些许的灵感,欢迎拍砖。

 

 

 

推荐阅读