注意:请参考底部的编辑内容。我是个白痴。
我有以下代码来处理一组标签名称并识别/处理新的标签:
IEnumberable<string> tagNames = GetTagNames();
List<Tag> allTags = GetAllTags();
var newTagNames = tagNames.Where(n => !allTags.Any(t => t.Name == n));
foreach (var tagName in newTagNames)
{
// ...
}
这个方法一直很好用,但当遇到带有 "Foo" 标签的情况且列表中只包含 "foo" 时,则会出现错误。换句话说,它没有进行大小写不敏感比较。
我更改了测试方法,使用了大小写不敏感比较,如下所示:
var newTagNames = tagNames.Where(n => !allTags.Any(t => t.Name.Equals(n, StringComparison.InvariantCultureIgnoreCase)));
当我运行foreach(并在newTagNames上调用MoveNext)时,突然抛出了异常。 异常显示:
序列中没有元素
我对此感到困惑。为什么foreach
坚持要求序列非空?如果我调用First()
,我会期望看到这个错误,但不是使用foreach
吧?
编辑:更多信息。
这变得越来越奇怪。因为我的代码在异步方法中,并且我很迷信,所以我决定在有问题的代码周围放置try/catch,希望验证引发异常的确是我认为的那样。
现在我可以在调试器中逐步执行foreach行,我可以验证序列为空,我可以一直走到调试器突出显示单词“in”的位置。再走一步,就进入了我的异常处理程序。
但是,它没有进入我刚添加的异常处理程序!它没有匹配catch (Exception ex)
,也没有匹配普通的catch
。(我还加了一个finally
,并验证了它在退出时访问)。
我始终认为这样的异常处理程序会捕获任何异常。我现在很害怕。我需要一个成年人。
编辑2:
好的,嗯,虚惊一场...只是因为我的本地try/catch没有捕获到异常,这个异常并不是由我认为的代码引发的。正如我上面所说,我在调试器中观察执行过程,从foreach
的“in”直接跳转到外部异常处理程序,因此我(错误地)假设那是错误的位置。然而,在空枚举中,那只是函数内执行的最后一个语句,由于某种原因,调试器没有显示我在调用点的函数之外的步骤或下一个语句的执行 - 实际上是导致错误的语句。
对于所有回复的人,我表示歉意,如果您想创建一个答案,说我是个白痴,我会非常感激。也就是说,如果我再次出现在SO上...
GetTagNames()
吗?尝试在它后面添加.ToList()
进行测试。 - MagnusString.Compare()
。Equals
方法比较的是引用类型,看它们是否引用同一个对象,这不是你在这里想要的。 - Jonathan WoodEquals
方法来比较字符串的基础值。它首先进行引用比较作为优化,可能会短路(所有的Equals
都可以选择性地执行此操作),但这并不是真正相关的。 - Servy