为什么我得到"序列不包含元素"?

Gar*_*ill 5 c# linq

注意:请参阅底部的编辑.我是一个白痴.

以下代码来处理标记名称集并识别/处理新标记:

IEnumberable<string> tagNames = GetTagNames();
List<Tag> allTags = GetAllTags();

var newTagNames = tagNames.Where(n => !allTags.Any(t => t.Name == n));

foreach (var tagName in newTagNames)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

...并且这很好,除了它没有处理有一个名为"Foo"的标签并且列表包含"foo"的情况.换句话说,它没有进行不区分大小写的比较.

我更改了测试以使用不区分大小写的比较,如下所示:

var newTagNames = tagNames.Where(n => !allTags.Any(t => t.Name.Equals(n, StringComparison.InvariantCultureIgnoreCase)));
Run Code Online (Sandbox Code Playgroud)

...当foreach运行(并调用MoveNext)newTagNames时,我突然抛出一个异常.例外说:

序列没有元素

我很困惑.为什么要foreach坚持序列非空?如果我打电话First(),我希望看到这个错误,但是在使用时却没有foreach


编辑:更多信息.

这一刻变得更加怪异.因为我的代码是异步方法,而且我很迷信,所以我认为引发异常的点与它被捕获和报告的点之间存在太大的"距离".所以,我对一个有问题的代码进行了try/catch,希望能够验证被抛出的异常是我认为的那样.

所以现在我可以在调试器中逐步进入foreach行,我可以验证序列是空的,并且我可以直接进入调试器突出显示单词"in"的位.还有一步,我在我的异常处理程序中.

但是,不是我刚刚添加的异常处理程序,不!它落在我最外层的异常处理程序中,而不访问我最近添加的异常处理程序!它不匹配catch (Exception ex),也不匹配普通catch.(我也确实放了一个finally,并证实它确实在出路时访问了它).

我一直认为,像这样的异常处理程序会捕获任何异常.我现在很害怕.我需要一个成年人.


编辑2:

好吧,嗯,误报......我的本地try/catch没有抓住异常只是因为它没有被我想到的代码引发.正如我上面所说,我看到调试器中的执行从直接的"in"跳转foreach到外部异常处理程序,因此我(错误的)假设这就是错误所在.但是,使用空枚举,这只是函数中执行的最后一个语句,并且由于某种原因,调试器没有向我显示函数的跳出或在调用点执行下一个语句 - 这是在事实上导致错误的那个.

向所有回复的人道歉,如果你想创造一个说我是老生常谈的回答,我会乐意接受.也就是说,如果我再次露出我的脸......

nas*_*ski 0

它不是那么正确或干净,但是它是如何工作的:

var newTagNames = tagNames.Where(n => !allTags.Any(t => t.Name.ToUpper() == n.ToUpper()));
Run Code Online (Sandbox Code Playgroud)