Как выполнить поиск по выпадающему списку со строкой, содержащей подстановочный знак?

У меня есть поле со списком, содержащее множество записей, таких как этот небольшой отрывок.

1R09ST75057
1R11ST75070
1R15ST75086
1R23ST75090
2R05HS75063
2R05ST75063
3R05ST75086
2R07HS75086

Теперь пользователь вводит некоторую информацию в форму, в результате чего создается строка, содержащая подстановочный (неизвестный) символ во второй позиции символа.

3?05ST75086

Теперь я хочу взять эту строку и выполнить поиск\фильтр по списку со списком и оставить этот элемент как выбранный или небольшой набор строк.

Если я знаю строку без подстановочного знака, я могу использовать следующее, чтобы выбрать ее в поле со списком.

 cmbobx_axrs75.SelectedIndex = cmbobx_axrs75.Items.IndexOf("2R05HS75063");

Я подумал, что могу сначала создать небольшое подмножество, в котором все первые символы одинаковы, затем создать подстроку каждого минус первые два символа и проверить это, но у меня может быть большое количество записей, и это займет слишком много времени, должно быть более легкий способ?

Любые идеи, как я могу сделать это с подстановочным котом в строке, пожалуйста?

Добавлена ​​информация:

Я хочу, чтобы выбранный элемент в поле со списком соответствовал моей строке.

Я выбираю элементы в форме и получаю строку 3–05ST75086. Теперь я хочу взять это и поискать, чтобы найти, какой именно, и выбрать его. Итак, из списка ниже

1R05ST75086
2R05ST75086
3R05ST75086
6R05ST75086
3R05GT75086
3R05ST75186

Я бы закончил с выбранным элементом в поле со списком как

3R05ST75086

Возможно, вы захотите изучить регулярные выражения (Regex-Class) для этого.

cmos 22.05.2019 15:48

Можете ли вы уточнить, какова ваша конечная цель? Вам нужен список строк, начинающихся с одних и тех же первых двух символов, или только с символа, который вы подставляете? Например, вам нужен список всех строк, начинающихся с 3R, или всех строк, начинающихся с 1R, 2R 3R, ...? И какой из них выбирается в поле со списком?

dvo 22.05.2019 15:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
291
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать регулярные выражения. Что-то вроде этого:

string[] data = new string[]
{
    "1R09ST75057",
    "1R11ST75070",
    "1R15ST75086",
    "1R23ST75090",
    "2R05HS75063",
    "2R05ST75063",
    "3R05ST75086",
    "2R07HS75086"
};

string pattern = "3*05ST75086";
string[] results = data
    .Where(x => System.Text.RegularExpressions.Regex.IsMatch(x, pattern))
    .ToArray();

Ваш шаблон регулярного выражения сделает необязательным только символ 3. Звездочки * не являются правильным подстановочным знаком для этой ситуации. Ему нужен заполнитель, такой как точка ., чтобы заполнить место чем-либо, или заполнитель, такой как [a-zA-Z], чтобы разрешить только буквы.

dvo 22.05.2019 16:30

@dvo: значение pattern — это просто пример, основанный на теперь пользователь вводит некоторую информацию в форме, в результате чего создается строка, содержащая подстановочный (неизвестный) символ во второй позиции символа..

mm8 22.05.2019 16:53

Вы можете использовать регулярное выражение для этой задачи. Во-первых, вам нужен метод для преобразования строки шаблона в регулярное выражение (он должен обрабатывать подстановочные знаки «*» и «?»):

private static string ConvertWildCardToRegex(string value)
{
    return "^" + Regex.Escape(value).Replace("\\?", ".").Replace("\\*", ".*") + "$";
}

Затем вы будете использовать его следующим образом:

List<string> comboBoxValues = new List<string>()
        {
            "1R09ST75057",
            "1R11ST75070",
            "1R15ST75086",
            "1R23ST75090",
            "2R05HS75063",
            "2R05ST75063",
            "3R05ST75086",
            "2R07HS75086"
        };

string searchPattern = "3?05ST75086";
string patternAsRegex = ConvertWildCardToRegex(searchPattern);
var selected = comboBoxValues.FirstOrDefault(c => Regex.IsMatch(c, patternAsRegex));
if (selected != null)
{
    int selectedIndex = comboBoxValues.IndexOf(selected);
}

Это предполагает, что вы заботитесь только о первом найденном совпадении. Если вам нужны все совпадения, замените FirstOrDefault(...) предложением Where(...) и замените оператор "if" циклом foreach.

Ответ принят как подходящий

Спасибо всем, кто помог, я использовал комбинацию элементов из всех ответов, поэтому все помогли мне ответить на этот вопрос.

Я добавил эту функцию из ответов, так как это кажется хорошей идеей, спасибо

 private static string ConvertWildCardToRegex(string value)
    {
        return "^" + Regex.Escape(value).Replace("\\?", ".").Replace("\\*", ".*") + "$";
    }

Затем я получаю элементы поля со списком в список. Я просматриваю список и принимаю еще несколько решений на основе результатов поиска.

List<string> comboBoxValues = new List<string>();

       for (int i = 0; i < cmbobx_in_focus.Items.Count; i++)
        {
            comboBoxValues.Add(cmbobx_in_focus.GetItemText(cmbobx_in_focus.Items[i]));

        }

string[] results = comboBoxValues
                .Where(x => Regex.IsMatch(x, ConvertWildCardToRegex(lbl_raster_used.Text)))
                .ToArray();

Теперь у меня есть массив с именем results, с которым легко работать.

Другие вопросы по теме