问题描述
我需要生成给定长度的字符串的所有子字符串。
例如,“ 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);
}
}