Member 12737864 Ответов: 3

Строка процесса в C#


У меня есть строка в C#, например: "Привет всем друзьям"
и как у меня может быть такая струна:
"(Привет всем и друзьям) или (Привет всем и друзьям) или (Привет всем и друзьям) или (Привет всем и друзьям) или (Привет всем) или (друзья) "
?

Что я уже пробовал:

потому что я хоть и очень разочарован

BillWoodruff

Как вы можете быть разочарованы, если вы ничего не пробовали ?

F-ES Sitecore

То, что ты пытаешься сделать, - плохая идея. Если это функция публичного поиска, то ваш код может работать невероятно плохо, если кто-то вставит длинную фразу, настолько плохо, что он может связать нить до тех пор, пока не истечет время ожидания и у вас не появится возможный вектор атаки DOS. Если это поиск по индексу, просто выбросьте все слова в качестве необязательных требований, и пусть индекс сделает всю работу за вас.

3 Ответов

Рейтинг:
2

Richard MacCutchan

Посмотрите на Класс String (System) | Microsoft Docs[^] и Класс StringBuilder (System.Text) | Microsoft Docs[^Между ними они содержат свойства и методы, которые могут решить большинство таких вопросов.


Рейтинг:
2

Richard Deeming

Разделите строку на слова. Если слова всегда разделены одиночными пробелами, вы можете использовать Строка.Расщеплять[^]; в противном случае вам может потребоваться использовать регулярное выражение:

string[] words = System.Text.RegularExpressions.Regex.Matches(input, @"\w+")
    .Cast<System.Text.RegularExpressions.Match>()
    .Select(m => m.Value)
    .ToArray();
Язык Регулярных Выражений - Краткий Справочник | Microsoft Docs[^]

Затем вам нужно сгенерировать все комбинации слов. У Эрика Липперта есть хорошая серия постов в блоге, объясняющих, как это сделать:
Создание комбинаций, часть первая | сказочные приключения в кодировании[^]

Или вы можете посмотреть на реализации кода Rosetta:
Комбинации - Код Розетты[^]

Простая версия может выглядеть примерно так:
static IEnumerable<IReadOnlyList<T>> AllCombinations<T>(IReadOnlyList<T> input)
{
    for (int m = input.Count; m >= 1; m--)
    {
        var result = new T[m];
        var stack = new Stack<int>();
        stack.Push(0);
        
        while (stack.Count > 0)
        {
            int index = stack.Count - 1;
            int value = stack.Pop();
            while (value < input.Count)
            {
                result[index] = input[value];
                index++;
                value++;
                
                stack.Push(value);
                
                if (index == m)
                {
                    yield return result;
                    break;
                }
            }
        }
    }
}

Затем вы объединяете их вместе:
IEnumerable<string> parts = AllCombinations(words).Select(c => string.Join(" AND ", c));
string result = "(" + string.Join(") OR (", parts) + ")";


Рейтинг:
1

CPallini

Ты должен

  • Разделите строку на ее части. слова (массив строк)
  • сделайте петлю, с помощью n=1,..,len где len является ли длина слова массив
  • на повторе n, найти комбинации из n предметы первой необходимости слова массив
  • перебирайте найденные комбинации печатая их правильно отформатированными


Найти такие комбинации может быть непросто. Эта страница дает большую помощь: c# - как использовать LINQ для поиска всех комбинаций n элементов из набора чисел? - переполнение стека[^].