为什么这个IndexOf调用返回-1?

时间:2013-10-30 13:15:28

标签: c# string winforms .net-3.5

据我所知,当找不到参数时,IndexOf会返回-1,但这对我没有意义。

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

    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,因为过滤器可能包含多个子句,因此不相等。

1 个答案:

答案 0 :(得分: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;

请注意,您应该在IndexOf

中使用StringComparison.OrdinalIgnoreCase
c.Checked = filter.IndexOf(cFilter, StringComparison.OrdinalIgnoreCase) >= 0;