热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:使用LINQ将字符串拆分为N长度字符串列表分享

使用LINQ将字符串拆分为N长度字符串列表我知道String.Split的概念之前已经通过多种不同的方法得到了解决,但我对这个问题的LINQ解决方案特别感兴趣。我试图编写一个扩展类

使用LINQ将字符串拆分为N长度字符串列表

我知道String.Split的概念之前已经通过多种不同的方法得到了解决,但我对这个问题的LINQ解决方案特别感兴趣。

我试图编写一个扩展类来处理拆分,但两次尝试都有一些重大问题。 所以对于以下内容:

string s = "ABCDEFGHIJKLMNOPQRSTUVWX"; var results = s.SplitEvery(4); 

我想要一个列表,如:{“ABCD”,“EFGH”,“IJKL”,“MNOP”,“QRST”,“UVWX”}

这是我的扩展类:

 public static class Extensions { public static List SplitEvery(this string s, int n) { List list = new List(); var Attempt1 = s.Select((c, i) => i % n== 0 ? s.Substring(i, n) : "|").Where(x => x != "|").ToList(); var Attempt2 = s.Where((c, i) => i % n== 0).Select((c, i) => s.Substring(i, n)).ToList(); return list; } } 

尝试1插入一个虚拟字符串“|” 每次不满足条件时,都会删除虚拟字符串的所有实例以创建最终列表。 它有效,但创建坏字符串似乎是一个不必要的额外步骤。 此外,如果字符串不能被n整除,则此尝试将失败。

尝试2是我试图仅选择索引可被N整除的子串,但Select语句中的’i’值与Where语句中的’i’值不对应,因此我得到如下结果:{“ ABCD“,”BCDE“等…}

我觉得我接近一个好的解决方案,但可以在正确的方向上使用有用的推动。 有什么建议?

[编辑]

我最终得到了一些建议来处理我的字符串拆分器。 它可能不是最快的,但作为LINQ的新手,这个实现对我来说是最简洁易懂的。

 public static List SplitEvery(this string s, int size) { return s.Select((x, i) => i) .Where(i => i % size == 0) .Select(i => String.Concat(s.Skip(i).Take(size))).ToList(); } 

感谢所有优秀的建议。

这是另一个解决方案:

 var result = s.Select((x, i) => i) .Where(i => i % 4 == 0) .Select(i => s.Substring(i, s.Length - i >= 4 ? 4 : s.Length - i)); 

 string s = "ABCDEFGHIJKLMNOPQRSTUVWX"; var results = s.Select((c, i) => new { c, i }) .GroupBy(x => xi / 4) .Select(g => String.Join("",g.Select(y=>yc))) .ToList(); 

您也可以使用morelinq的批处理

 var res = s.Batch(4).Select(x => String.Join("", x)).ToList(); 

如果你不介意使用副作用,这也是可能的

 var res2 = s.SplitEvery(4).ToList(); public static IEnumerable SplitEvery(this string s, int n) { int index = 0; return s.GroupBy(_=> index++/n).Select(g => new string(g.ToArray())); } 

当然每个字符串操作问题都值得一个正则表达式的答案:)

 var res3 = Regex.Split(s, @"(?<=G.{4})"); 

你可以使用这个扩展方法,它通过简单的子字符串获取实现(我相信它比枚举字符并将它们连接成字符串更快):

 public static IEnumerable SplitEvery(this string s, int length) { int index = 0; while (index + length  

 public static IEnumerable SplitEvery(this string s, int length) { return s.Where((c, index) => index % length == 0) .Select((c, index) => String.Concat( s.Skip(index * length).Take(length) ) ); } 

陪审团关注的是new String(chars.ToArray())是否会比String.Concat(chars)更快或更慢。

您当然可以追加.ToList()来返回List而不是IEnumerable

Substring应该可以选择字符串的4个字符部分。 你只需要小心最后一部分:

 new Func>( (string s, int n) => Enumerable.Range(0, (s.Length + n-1)/n) .Select(i => s.Substring(i*n, Math.Min(n, s.Length - i*n)))) ("ABCDEFGHIJKLMNOPQRSTUVWX", 4) 

注意:如果此答案转换为generics可枚举操作,则必须多次迭代集合( Count()Substring转换为Skip(i*n).Take(n) )。

这似乎有效:

 public static IEnumerable SplitEvery(this string s, int n) { var enumerators = Enumerable.Repeat(s.GetEnumerator(), n); while (true) { var chunk = string.Concat(enumerators .Where(e => e.MoveNext()) .Select(e => e.Current)); if (chunk == "") yield break; yield return chunk; } } 

这里有几种LINQy方法:

 public static IEnumerable SplitEvery( this IEnumerable s , int n ) { StringBuilder sb = new StringBuilder(n) ; foreach ( char c in s ) { if ( sb.Length == n ) { yield return sb.ToString() ; sb.Length = 0 ; } sb.Append(c) ; } } 

要么

 public static IEnumerable SplitEvery( this string s , int n ) { int limit = s.Length - ( s.Length % n ) ; int i = 0 ; while ( i  

这也有效,但需要“展开” IGrouping

 public static IEnumerable Split(this String me,int SIZE) { //Works by mapping the character index to a 'modulo Staircase' //and then grouping by that 'stair step' value return me.Select((c, i) => new { step = i - i % SIZE, letter = c.ToString() }) .GroupBy(kvp => kvp.step) .Select(grouping => grouping .Select(g => g.letter) .Aggregate((a, b) => a + b) ); } 

编辑:使用LINQ的惰性评估机制( yield return ),您也可以使用递归实现此目的

 public static IEnumerable Split(this String me, int SIZE) { if (me.Length > SIZE) { var head = me.Substring(0,SIZE); var tail = me.Substring(SIZE,me.Length-SIZE); yield return head; foreach (var item in tail.Split(SIZE)) { yield return item; } } else { yield return me; } } 

虽然,就个人而言,我远离Substring因为它鼓励状态良好的代码(父或全局范围内的计数器,索引等)。

上述就是C#学习教程:使用LINQ将字符串拆分为N长度字符串列表分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---编程笔记


推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
author-avatar
左伊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有