0

说我有一个字符串var s = "123456789"

在哪里

foreach(var c in DivideStr(s, 3)){
  Console.WriteLine(c);
}

会打印出来123, 456,789

这是一个相当容易用循环和 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

问题是上面的代码无法编译。我错过了什么?

4

2 回答 2

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());
        }
    }

尽管以这种方式使用SkipandTake并没有太大的实际意义,因为我们还不如在s.Substring(...)没有任何枚举器开销的情况下产生 -s。

于 2012-05-02T20:58:10.403 回答
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();
于 2012-05-02T22:19:07.313 回答