说我有一个字符串var s = "123456789"
其中
foreach(var c in DivideStr(s, 3)){
Console.WriteLine(c);
}
会打印出123
,456
,789
使用loop和if语句完成这是一个相当容易的问题。但我希望在C#中使用Take
和Skip
函数以下列方式完成
IEnumerable DivideStr(String s, Int n)
{
var a = s;
while(!a.IsEmpty())
{
yield return a.Take(n)
a = a.Drop(3) // or a.Skip(n)
}
}
这样,如果我有var s = "12345678"
打印输出为123
,456
和78
问题是上面的代码无法编译。我错过了什么?
答案 0 :(得分:2)
如果s
为"12345678"
,则会产生123
,456
,然后78
。
public static IEnumerable<string> DivideStr(String s, int n)
{
for (int currentPos = 0; currentPos < s.Length; currentPos += n)
{
yield return new string(s.Skip(currentPos).Take(n).ToArray());
}
}
尽管以这种方式使用Skip
和Take
并没有太大的实际意义,因为我们也可以在没有任何枚举器开销的情况下产生s.Substring(...)
- 。
答案 1 :(得分:1)
尝试这样的事情
IEnumerable<string> splitstrings = Enumerable.Range(0, str.Length / 3)
.Select(i => str.Substring(i * 3, 3));
或者这个
List<string> splitstrings = (from Match m in Regex.Matches(str, @"\d{1,3}")
select m.Value).ToList();