字符串按长度转换成数组
今天群里人突然发问形如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种方法,从个人角度来看,推荐大家使用正则,及上图中的第三种,其他三种方法不是引入了第三方类库,就是代码方法太生僻,希望能给大家带来些许的灵感,欢迎拍砖。