1

我知道 IndexOf 在找不到参数时返回 -1,但这对我来说没有意义。

我有这段代码遍历表单上的所有 DevExpress 复选框,检查它们的标签是什么,并尝试在传递给该方法的“过滤器”参数中找到它。如果在过滤器中找到标签,它应该选中该复选框。它总是等同于假。

    public void FilterChanged(Control.ControlCollection controls, string filter)
    {
        filter = filter.Replace("[", String.Empty);
        filter = filter.Replace("]", String.Empty);

        foreach (Control control in controls)
        {
            if (control is CheckEdit && control.Tag != null)
            {
                var c = (CheckEdit)control;
                var cFilter = c.Tag.ToString();
                cFilter = cFilter.Replace("(", String.Empty);
                cFilter = cFilter.Replace(")", String.Empty);

                if (filter.ToUpper().IndexOf(c.Tag.ToString().ToUpper()) >= 0)
                    c.Checked = true;
                else
                    c.Checked = false;
            }
        }
    }

我在我的内部IF语句上设置了一个断点,并在我的即时窗口中输入了以下内容:

filter.ToUpper().IndexOf(c.Tag.ToString().ToUpper())= -1

filter.ToUpper()= "文件不像'%VERSIONINFO.CS%'"

cFilter.ToUpper()= "文件不像'%VERSIONINFO.CS%'"

这些看起来几乎完全相同,所以它不应该返回 0 吗?

我不能使用equals,因为过滤器可能包含多个子句,因此不相等。

4

1 回答 1

8
cFilter.ToUpper() = "FILE NOT LIKE '%VERSIONINFO.CS%'"

这些看起来几乎完全相同,所以它不应该返回 0 吗?

但是您使用c.Tag.ToString()的是cFilter.ToUpper().

所以这应该按预期工作:

if (filter.ToUpper().IndexOf(cFilter.ToUpper()) >= 0)
    c.Checked = true;
else
    c.Checked = false;

请注意,您应该StringComparison.OrdinalIgnoreCaseIndexOf

c.Checked = filter.IndexOf(cFilter, StringComparison.OrdinalIgnoreCase) >= 0;
于 2013-10-30T13:19:15.773 回答