在List <string>中搜索带有通配符</string>的值

时间:2013-03-07 16:35:47

标签: c# asp.net regex linq

我目前已将用户有权访问的组织列表设置为列表(List<string> userOrg)。

列表内容如下所示:

34598
34599
23%

然后我使用此列表填充gridview,因此gridview将为我提供以下所有信息:

34598
34599
everything that starts with: 23

现在我想以某种方式让用户能够搜索gridview

他们将要查找的组织放入文本框中,它填充得很好,但我如何确保只显示他们有权访问的组织?

我想我要问的是,我如何搜索用户组织列表以确保有问题的组织在其中,但同时考虑到通配符。

例如,如果他们搜索“345%我只想显示34598和34599,但不是34566,因为这些是用户可以访问的(在我的userOrg列表中)

我从这开始,但不知道如何处理通配符:

List<string> org = new List<string>();
    List<string> userOrg = new List<string>();
    userOrg = (List<string>)Session["UserOrgs"] ;

    if (txtOrg.Text == "")
        Session["UserOrgs"] = userOrg;              
    else
    {
        foreach (string item in userOrg)
        {
            if(Regex.IsMatch(item, txtOrg.Text))
               org.Add(txtOrg.Text);
        }
        Session["UserOrgs"] = org;
    }
    ObjectDataSource1.Select();

现在,如果我在文本框中输入23%来搜索我有权访问的所有组织,并以23开头,它会匹配并进入if,但是如果我放入 2%进入文本框,它与O在我的userOrg列表中的23%不匹配,并且不返回任何内容。

也许有一种方法可以更轻松地使用LINQ?我之前没有做过多少工作。

1 个答案:

答案 0 :(得分:0)

一般来说,当标准字符串操作完成时,我不喜欢使用正则表达式,因为我坚信后者更容易理解,因此更易于维护。在这种情况下,我很想做类似的事情:

Bool isVisible = userOrgs.Any(delegate(string x)
                              {
                                  String y = txtOrg.Text;
                                  if (y.EndsWith("%"))
                                  {
                                      return x.StartsWith(y.TrimEnd('%'));
                                  }
                                  if (x.EndsWith("%"))
                                  {
                                      return y.StartsWith(x.Trim('%'));
                                  }
                                  return x == y;
                              }

如果你是正则表达式,那么可以随意添加它们。