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

Generating all the substring of a given length using 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);
        }
    }