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

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

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
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
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, с которым легко работать.

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