将字符串分为长度为3的集合字符串

时间:2012-05-02 20:47:44

标签: c# linq ienumerable

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

其中

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

会打印出123456789

使用loop和if语句完成这是一个相当容易的问题。但我希望在C#中使用TakeSkip函数以下列方式完成

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" 打印输出为12345678

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

2 个答案:

答案 0 :(得分:2)

如果s"12345678",则会产生123456,然后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());
        }
    }

尽管以这种方式使用SkipTake并没有太大的实际意义,因为我们也可以在没有任何枚举器开销的情况下产生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();