我知道 String.Split 的概念之前已经通过多种不同的方法得到解决,但我对这个问题的 LINQ 解决方案特别感兴趣。
我试图编写一个扩展类来处理拆分,但是这两种尝试都有一些主要问题。因此,对于以下内容:
string s = "ABCDEFGHIJKLMNOPQRSTUVWX";
var results = s.SplitEvery(4);
我想要一个类似的列表:{“ABCD”、“EFGH”、“IJKL”、“MNOP”、“QRST”、“UVWX”}
这是我的扩展类:
public static class Extensions
{
public static List<string> SplitEvery(this string s, int n)
{
List<string> list = new List<string>();
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<string> 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();
}
感谢所有优秀的建议。