我知道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();
}
感谢各位提供的卓越建议。
Concat
和Take
的确看起来是最佳方法。 - Alexei LevenkovFile.ReadAllLines
。有几个答案(即使用yield return
)展示了只迭代集合一次的方法。 - Alexei Levenkov