我的目标是遍历字符串数据库,并在每次子字符串出现时获取计数。换句话说,我需要从字符串中提取所有可能的单词组合。
例如,输入可能是"this is the first string"
。
我想提取"this is"
,"is the"
,"the first"
,"first string"
,"this is the"
,"is the first"
,"the first string"
, "this is the first"
,"is the first string"
。
我只需要从左到右,总是按顺序。
我不确定从哪里开始。我已经有了读取数据库并保存到列表中的代码,只需要知道如何根据空格字符提取所有可能的子字符串。
答案 0 :(得分:2)
List<string> WordCombinations(string phrase)
{
List<string> combinations = new List<string>();
string[] words = phrase.Split();
// We want all 2 word combinations, then 3, then 4, ...
for (int take = 2; take < words.Length; take++)
{
// Start with the first word, then second, then ...
for (int skip = 0; skip + take <= words.Length; skip++)
{
combinations.Add(string.Join(" ", words.Skip(skip).Take(take).ToArray()));
}
}
return combinations;
}
答案 1 :(得分:2)
以下方法构建字符串中所有空格的索引列表(加上名义的起始和结束空格),然后返回每个有序索引对之间的子字符串:
static IEnumerable<string> SpaceDelimitedSubstrings(string input)
{
List<int> indices = new List<int> { -1 };
int current = -1;
while ((current = input.IndexOf(' ', current + 1)) > -1)
{
indices.Add(current);
}
indices.Add(input.Length);
int minLength = 1;
for (int i = 0; i < indices.Count - minLength; i++)
for (int j = i + minLength; j < indices.Count; j++)
yield return input.Substring(indices[i] + 1, indices[j] - indices[i] - 1);
}
如下所示
string input = "this is the first string";
foreach (var s in SpaceDelimitedSubstrings(input))
{
Console.WriteLine(s);
}
它给出了
将minLength
更改为2
会删除单字返回。
答案 2 :(得分:0)
使用String.Split()?怎么样然后你有所有单词,只需要可能的组合。
做上述事情的简单示例:
string input = "this is the first string";
var items = input.Split(' ');
var result = new List<string>();
// this gets only 2-word-combinations
for (var i = 0; i < items.Count() - 1; i++)
{
result.Add(items[i] + " " + items[i + 1]);
}
// from this point: search the 3-words etc. or put this in recursion
答案 3 :(得分:0)
一种方式可能是:
myString.Split()
如果你不提供任何参数,它将拆分字符串忽略空格字符(制表符,换行符(s.a. Environment.NewLine)等)。
当你拥有所有子串时,你可以轻松地通过它们。 请记住,这可能会很慢,因为每次都必须通过字符串来提取子字符串。
答案 4 :(得分:0)
您可以使用String.Split()
将字符串解析为令牌。然后,您可以组合这些令牌以创建所需的组合。