C#新手提问:整数赋值不按预期工作

4

我在这里尝试进行一个简单的比较,但是赋值并不像我想象的那样工作...以下是代码:

int returnDateIndex(Paragraph para)
{
    long firstIndex = 0;
    for (int i = 0; i < para.Words.Count; i++)
    {
        if (para.Words[i].Text == "Second")
        {
            if (para.Words[i - 1].Text == "First")
            {                        
                firstIndex = para.Words[i].FirstSymbolPosition;
            }
        }
    }     
    return (int)firstIndex;
}

我在VS中运行了我的调试器,当该赋值语句被调用时,右侧的int等于50,但左侧的int仍然等于0。不知道我错过了什么。
该应用程序正在使用Abbyy FineReader 9.0 SDK,FirstSymbolPosition的文档称其返回一个只读的Long。
编辑:代码已经剥离了所有功能,以便观看者更容易看到问题所在。请在评论中回答原始问题和任何其他困扰您的代码问题。

你在检查值时,打算在哪里中断程序? - asgerhallas
4个回答

3
一个明显的错误是你期望返回第一个匹配条件的情况(因此变量名为firstIndex),但实际上你返回的是最后一个匹配点。这也很糟糕,因为这意味着在找到匹配项后,你继续查找。另一个错误是如果一个句子中的第一个单词是“Second”,你会尝试引用一个负索引,这是非常糟糕的。请改用以下方式:
int returnDateIndex(Paragraph para)
{
    for (int i = 1; i < para.Words.Count; i++) 
    {
        if (para.Words[i - 1].Text == "First" && para.Words[i].Text == "Second")                        
            return (int)para.Words[i].FirstSymbolPosition;
    }
    return 0; // this is what your original code would have returned in a "not found" scenario
}

这段代码修复了两个错误,并完全避开了你的赋值问题。

谢谢,实际上这只发生了一次 =)变量名称已更改以适应问题,抱歉让您感到困惑。 - Josh K
1
“i++ para.Words[i - 1].Text == 'First'” 的意思是什么? - Maciej Hehl
啊!:( 这是从原始文本复制粘贴错误。我应该更早地发现它。现在已经修复了。 - Joel Coehoorn

1

另外,您应该在分配firstIndex后添加break,否则如果在循环后面的条件满足时,它可能会被其他值覆盖。


感谢建议...不过这段代码已经被精简了,以便在此处发布。 - Josh K
1
更不用说加上一些额外的条件,以便如果“Second”是段落的第一个单词,它就不会抛出ArrayIndexOutOfBoundsException异常。 - Marc Bollinger
是的,我把它命名为Second,因为这个单词不可能出现在第一个单词之前。我想我应该提到我正在处理非常强格式化的文件,并且正如我所提到的,我有一个检查错误的超出索引。 - Josh K

1
除了ChrisF所说的,这还是非常危险的:
if (para.Words[i - 1].Text == "First")

这里没有检查确保 i 大于或等于 1,如果 i 等于 0,则会超出数组索引。


是的,还有其他的检查措施,这只是裸代码,问题仍然存在,不过还是谢谢。 - Josh K

0

FYI:在 .net 中比较并不总是按照你期望的方式进行。基本类型的比较与复杂类型的比较是不同的。如果你比较整数,你会得到内容的比较。如果你比较对象,你比较的是对象的地址而不是其内容。


这与他的问题有什么关系? - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接