Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用包含通配符的字符串在组合框中搜索?_C#_Combobox_Full Text Search - Fatal编程技术网

C# 如何使用包含通配符的字符串在组合框中搜索?

C# 如何使用包含通配符的字符串在组合框中搜索?,c#,combobox,full-text-search,C#,Combobox,Full Text Search,我有一个组合框,里面有很多条目,比如这个小摘录 1R09ST75057 1R11ST75070 1R15ST75086 1R23ST75090 2R05HS75063 2R05ST75063 3R05ST75086 2R07HS75086 用户现在以某种形式输入一些信息,从而生成一个字符串,其中第二个字符位置有一个通配符(未知)字符 3?05ST75086 现在,我想获取此字符串并搜索\筛选组合框列表,然后将此项目作为选中项或一小组字符串保留 如果我知道没有通配符的字符串,我可以使用以下命令

我有一个组合框,里面有很多条目,比如这个小摘录

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

可以使用正则表达式。大概是这样的:

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

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

然后您将按如下方式使用它:

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);
}
List comboBoxValues=new List()
{
“1R09ST75057”,
“1R11ST75070”,
“1R15ST75086”,
“1R23ST75090”,
“2R05HS75063”,
“2R05ST75063”,
“3R05ST75086”,
“2R07HS75086”
};
string searchPattern=“3?05ST75086”;
字符串模式asregex=ConvertWildCardToRegex(searchPattern);
var selected=comboxvalues.FirstOrDefault(c=>Regex.IsMatch(c,patternAsRegex));
如果(已选择!=null)
{
int selectedIndex=comboBoxValues.IndexOf(已选);
}

这假设您只关心第一个找到的匹配项。如果您需要所有匹配项,请用Where(…)子句替换FirstOrDefault(…),并用foreach循环替换“If”语句。

感谢所有帮助,我使用了所有答案中的项目组合,所以每个人都帮我回答了这个问题

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

 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();
List comboBoxValues=new List();
对于(int i=0;iRegex.IsMatch(x,ConvertWildCardToRegex(lbl\u raster\u used.Text)))
.ToArray();

我现在有一个名为results的数组,它很容易使用。

您可能需要研究正则表达式(Regex类)。您能详细介绍一下您的最终目标吗?您想要以相同的前两个字符开头的字符串列表,还是只需要通配符?例如,您想要以
3R
开头的所有字符串的列表,还是以
1R,2R 3R,…
开头的所有字符串的列表?在组合框中选择哪一个?您的正则表达式模式只会使
3
字符成为可选字符。星号
*
不是这种情况下的正确通配符。他需要一个像点
这样的占位符来填充任何东西,或者像
[a-zA-Z]
这样的占位符来只允许字母。@dvo:pattern的值只是一个例子,用户现在在表单中输入了一些信息,结果生成了一个带有通配符(未知)的字符串第二个字符位置的字符。
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();