if-evaluation的奇怪行为

时间:2013-11-05 15:02:57

标签: c# if-statement conditional-statements

我想检查Arguments是否包含来自ParameterSwitches的字符串。如果是这种情况,则应从参数中删除它。

问题是,即使pSwitch与Arguments [i]具有相同的值,条件也不会成立且Arguments [i] = null;不会被执行。

我已经尝试了一步一步调试器,让它更加困惑,因为它证实了我的假设。

string[] Arguments = new string[]{/*some strings*/};
string[] ParameterSwitches = new string[]{/*some strings*/};
for (int i = 0; i < Arguments.Length; i++)
{
    foreach (string pSwitch in ParameterSwitches)
    {
        if (pSwitch == Arguments[i])
        {
            Arguments[i] = null;
        }
    }
}

有人能想象出现这种情况吗?

提前致谢

更新 哦女孩和男人...... 下次我在问这里之前先用眼镜。 其中一根琴弦后面有一个小空格。 那就是问题所在。修剪成功了。

if (String.Equals(pSwitch.Trim().ToUpper(), Arguments[i].Trim().ToUpper()))
{
    Arguments[i] = null;
}

“问题”已解决

3 个答案:

答案 0 :(得分:3)

试试这个:

if(string.Equals(pSwitch.Trim(), Arguments[i].Trim(), StringComparison.OrdinalIgnoreCase))

我认为你的字符串不匹配,因为它们没有被修剪,或者情况有误,任何其他情况都不符合你的描述

答案 1 :(得分:0)

对于预定义的值类型,如果操作数的值相等,则等于运算符(==)返回true,否则返回false。对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true。对于字符串类型,==比较字符串的值。

我认为这是由于Arguments [i]与每个循环的取消引用,它将每个迭代的值放在一个字符串对象中。

如果您像在外部循环中那样将内循环更改为命令式代码会发生什么,从而引入另一个迭代变量。或者反过来为每个循环创建两个。

答案 2 :(得分:0)

错误的数组值,代码工作。

private static void Main(string[] args)
{
    string[] Arguments = new string[] {"111", "222"};
    string[] ParameterSwitches = new string[] {"111", "222"};
    for (int i = 0; i < Arguments.Length; i++)
    {
        foreach (string pSwitch in ParameterSwitches)
        {
            if (pSwitch == Arguments[i])
            {
                // set breakpoint here to see
                Arguments[i] = null;
            }
        }
    }
}

试试吧