如何使用包含野猫的字符串搜索组合框?

时间:2019-05-22 13:39:57

标签: c# combobox full-text-search

我有一个组合框,其中包含很多条目,例如这个小片段

let array = ['a','b','c'];
let i=3;

console.log('!==', i!==array.length );

console.log('!=', i!=array.length );

console.log('<', i<array.length );

console.log('=', i=array.length );

用户现在以某种形式输入一些信息,导致生成的字符串在第二个字符位置处带有通配符(未知)。

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

我现在想使用此字符串并在组合框列表中进行搜索\过滤,并保留选中的该项或少量字符串。

如果我知道不带通配符的字符串,则可以使用以下内容在组合框中选择它。

3?05ST75086

我以为我可以先创建一个小的子集,每个子​​集都具有相同的第一个字符,然后为每个子字符串减去前两个字符组成一个子串,然后检查此字符,但是我可以输入大量条目,这将花费太多时间一定有更简单的方法吗?

有什么想法请问如何使用字符串中的wildcat做到这一点?

添加的信息:

我想在组合框中选择与我的字符串匹配的项目。

我从表单上的项目中进行选择,并产生字符串3?05ST75086。我现在要接受此搜索并查找它是哪一个并选择它。所以从下面的列表中

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

我最终会在组合框中选择的项目为

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

3 个答案:

答案 0 :(得分:1)

您可以使用正则表达式。像这样:

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();

答案 1 :(得分:1)

您可以为该任务使用正则表达式。首先,您需要这样一种将模式字符串转换为Regex的方法(它应处理“ *”和“?”通配符):

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(...)子句,并用foreach循环交换“ if”语句。

答案 2 :(得分:-1)

感谢所有帮助,我使用了所有答案中的多项内容,因此每个人都帮助我回答了这个问题。

我从答案中添加了此功能,因为这似乎是个好主意,谢谢

 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();

我现在有了一个名为result的数组,该数组易于使用。