【问题标题】:How to search through combobox with a string containing a wildcat?如何使用包含通配符的字符串搜索组合框?
【发布时间】:2019-10-09 00:36:41
【问题描述】:

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

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)。
  • 您能否详细说明您的最终目标是什么?你想要一个以相同的前两个字符开头的字符串列表还是只是你要使用通配符的字符?例如,您想要以3R 开头的所有字符串的列表还是以1R, 2R 3R, ... 开头的所有字符串的列表?在组合框中选择了哪一个?

标签: c# combobox full-text-search


【解决方案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();

【讨论】:

  • 您的正则表达式模式只会使3 字符可选。对于这种情况,星号 * 不是正确的通配符。他需要一个像点 . 这样的占位符来填充任何东西,或者像 [a-zA-Z] 这样的占位符来只允许字母。
  • @dvo:pattern 的值只是基于 的示例在它的第二个字符位置.
【解决方案2】:

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

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”语句。

【讨论】:

    【解决方案3】:

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

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

     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 的数组,它很容易使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多