【问题标题】:How can I exactly match a string inside of a larger string?如何精确匹配较大字符串中的字符串?
【发布时间】:2014-07-08 18:23:03
【问题描述】:

我声明了以下枚举:

public enum EtcMethod
{
    ACCORD,
    COROLLA,
    COROLLA_S,
    CAMRY,
    CIVIC
}

在我的表单上,我有一些带有 Tag 属性集的控件:

myControl1.Tag = "ACCORD";
myControl2.Tag = "COROLLA";
myControl3.Tag = "CIVIC COROLLA_S CAMRY";

然后我在循环中检查控件的标签以查看是否找到任何值:

    private void HideControls(EtcMethod etcMethod, LayoutControlGroup lcg)
    {
        foreach (BaseLayoutItem ctl in lcg.Items)
        {
            if (ctl.GetType() == typeof (LayoutControlItem))
            {
                LayoutControlItem item = (LayoutControlItem)ctl;

                if (item.Tag.ToString().IndexOf(etcMethod.ToString()) >= 0)
                    item.Visibility = LayoutVisibility.Always;
                else
                    item.Visibility = LayoutVisibility.Never;
            }
        }
    }

但问题是,例如,如果 etcMethodCOROLLA 并且 item.Tag.ToString()"COROLLA_S" 会错误地通过检查。

如何确保它会找到完全匹配而不是“部分”匹配?换句话说,我希望它的行为就像您使用 Visual Studio 的查找功能检查了“匹配整个单词”选项一样。

我能想到的唯一解决方案是检查etcMethod.Lenght+1 处字符的值,看看它是否是空格(表示另一个枚举值的开头)或者该位置是否存在(表示结束标记),但这似乎特别草率。

【问题讨论】:

  • 在较大的字符串中找到匹配的起始索引,然后:largerString.Substring(indexOfMatch, lengthOfMatch)

标签: c# winforms .net-3.5


【解决方案1】:

你为什么不Split它并使用包含?

if (item.Tag.ToString().Split().Contains(etcMethod.ToString()))

这将首先在空间上拆分您的Tag,如果它没有空间,则将其转换为字符串数组,然后在数组上使用Contains 将查找完全匹配。

【讨论】:

  • 啊,我总是忘记Split-很少使用它。谢谢,这似乎是最有说服力的解决方案,但是我不能像 Cannot access explicit implementation of IList.Contains 所说的那样调用包含。我所做的就是将它分成两部分并遍历 Split() 返回的值。
  • @sab669 将using System.Linq 指令添加到您的项目中
  • 完美!不知道为什么 VS 不推荐那个……推荐这种东西通常很好。
【解决方案2】:

这可能是一种解决方案:

if (item.Tag.ToString() + " ").IndexOf(etcMethod.ToString() + " ") >= 0)

【讨论】:

  • 看看这个,我想它会起作用,但我更愿意尽可能避免不必要的串联。
  • @GrantWinney 这就是为什么他在调用IndexOf 之前将一个空格附加到item.Tag,所以这两个值将始终以一个空格结尾。
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2022-11-26
相关资源
最近更新 更多