0

我的目标是遍历字符串数据库并在每次出现每个子字符串时获取计数。换句话说,我需要从字符串中提取所有可能的单词组合。

例如,输入可能是"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".

我只需要从左到右,总是按顺序。

我不确定从哪里开始。我已经有了读取数据库并保存到列表中的代码,只需要知道如何根据空格字符提取所有可能的子字符串。

4

5 回答 5

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;
    }
于 2013-01-22T13:07:19.170 回答
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);
}

它给

这

更改minLength2将删除单个单词的返回。

于 2013-01-22T13:17:03.437 回答
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
于 2013-01-22T12:52:40.387 回答
0

一种方法可能是:

myString.Split()

如果您不提供任何参数,它将忽略空格字符(制表符、换行符(sa Environment.NewLine)等)拆分字符串。

当您拥有所有子字符串时,您可以轻松地通过它们连接。请记住,这可能会很慢,因为您每次都必须通过字符串来提取子字符串。

于 2013-01-22T12:55:01.923 回答
0

您可以使用String.Split()为了将字符串解析为标记。然后,您可以组合这些标记以创建您想要的组合。

于 2013-01-22T12:56:54.873 回答