据我所知,当找不到参数时,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,因为过滤器可能包含多个子句,因此不相等。
答案 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;