С# общий подстрочный список/извлечение

59
4

Моя цель - запустить базу данных строк и получить счетчик каждый раз, когда происходит каждая подстрока. Другими словами, мне нужно извлечь все возможные комбинации слов из строки.

Например, вход может быть "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".

Мне нужно идти только направо, всегда в порядке.

Я не совсем уверен, с чего начать. У меня уже есть код для чтения базы данных и сохранения в списке, просто нужно знать, как извлечь все возможные подстроки на основе символа пробела.

спросил(а) 2013-01-22T15:49:00+04:00 7 лет, 1 месяц назад
1
Решение
60

Следующий метод создает список индексов всех пробелов в вашей строке (плюс условные начальные и конечные пробелы), а затем возвращает подстроку между каждой упорядоченной парой индексов:

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);
}

это дает

this

Изменение minLength до 2 приведет к отключению однословных возвратов.

ответил(а) 2013-01-22T16:17:00+04:00 7 лет, 1 месяц назад
62

    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-22T16:07:00+04:00 7 лет, 1 месяц назад
35

Вы можете использовать String.Split() для анализа строки в токенах. Затем вы можете объединить эти жетоны, чтобы создать нужные комбинации.

ответил(а) 2013-01-22T15:56:00+04:00 7 лет, 1 месяц назад
38

Одним из способов может быть:

myString.Split()

Если вы не укажете никаких аргументов, он разделит строку, игнорирующую пробельные символы (вкладки, newline (sa Environment.NewLine) и т.д.).

Когда у вас есть все подстроки, вы можете легко пройти через них. Имейте в виду, что это может быть медленным, потому что вам придется каждый раз проходить через строку, чтобы извлечь подстроки.

ответил(а) 2013-01-22T15:55:00+04:00 7 лет, 1 месяц назад
35

Как насчет использования 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-22T15:52:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема