使用yield产生给定长度的所有子串

问题描述

我需要生成给定长度的字符串的所有子字符串。

例如,“ abcdefg”的所有长度为3的子字符串都是:

abc
bcd
cde
def
efg

为此任务,我编写了以下函数

public static IEnumerable<string> AllSubstringsLength(string input,int length)
{
    List<string> result = new List<string>();
    for (int i = 0; i <= input.Length - length; i++)
    {
        result.Add(input.Substring(i,length));
    }
    return result;
}

我这样使用:

foreach(string s in AllSubstringsLength("abcdefg",3))
    System.Console.WriteLine(s);

我想知道是否可以编写相同的函数来避免使用变量result并使用yield

解决方法

当然可以。

    public static IEnumerable<string> AllSubstringsLength(string input,int length)
    {
        for (int i = 0; i < input.Length; i++)
        {
            if (i + length > input.Length) yield break;
            yield return input.Substring(i,length);
        }
    }

您还可以通过将条件修改为一点来避免循环中的if i <= input.Length - length,因此您的方法变为:

    public static IEnumerable<string> AllSubstringsLength(string input,int length)
    {
        for (int i = 0; i <= input.Length - length; i++)
        {
            yield return input.Substring(i,length);
        }
    }