Как искать в выпадающем списке со строкой, содержащей дикую кошку? - PullRequest
0 голосов
/ 22 мая 2019

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

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

Пользователь теперь вводит некоторую информацию в форму, которая приводит к получаемой строке, которая имеет wildcat (неизвестно)символ в нем во второй позиции символа

3?05ST75086

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

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

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

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

Есть идеи, как яможно сделать это с помощью wildcat в строке, пожалуйста?

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

Я хочу закончить с выбранным элементом в Combobox, соответствующим моей строке.

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

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

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

3R05ST75086

Ответы [ 3 ]

1 голос
/ 22 мая 2019

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

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.

1 голос
/ 22 мая 2019

Вы можете использовать регулярные выражения. Примерно так:

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();
0 голосов
/ 23 мая 2019

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

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

 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, с которым легко работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...