У меня есть поле со списком, содержащее множество записей, таких как этот небольшой отрывок.
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
Можете ли вы уточнить, какова ваша конечная цель? Вам нужен список строк, начинающихся с одних и тех же первых двух символов, или только с символа, который вы подставляете? Например, вам нужен список всех строк, начинающихся с 3R
, или всех строк, начинающихся с 1R, 2R 3R, ...
? И какой из них выбирается в поле со списком?
Вы можете использовать регулярные выражения. Что-то вроде этого:
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: значение pattern
— это просто пример, основанный на теперь пользователь вводит некоторую информацию в форме, в результате чего создается строка, содержащая подстановочный (неизвестный) символ во второй позиции символа..
Вы можете использовать регулярное выражение для этой задачи. Во-первых, вам нужен метод для преобразования строки шаблона в регулярное выражение (он должен обрабатывать подстановочные знаки «*» и «?»):
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, с которым легко работать.
Возможно, вы захотите изучить регулярные выражения (Regex-Class) для этого.