使用 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);
}
}
我需要生成一个字符串的给定长度的所有子串。
例如"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);
}
}