【问题标题】:"Enumeration yielded no results" when there is clearly a result有明显结果时的“枚举没有结果”
【发布时间】:2017-03-03 20:59:23
【问题描述】:

我正在对旧应用程序进行故障排除,并且很难理解为什么变量没有进入 foreach 循环。我的问题是我在处理泛型/集合/LINQ 方面的经验非常有限。如果这是一个基本问题,请原谅。

我有以下变量:

var allegationlist = allegation.Where(x => x.DaType == datype.FirstOrDefault().IntakeServReqTypeKey && x.DaSubType == subtypedetail.FirstOrDefault().ClassKey && x.DaNumber == daNumber);

当我将鼠标悬停在 where 语句中的每个元素上时,它们都有值。示例:

x.DaType == datype.FirstOrDefault().IntakeServReqTypeKey has a value of "Complaint-DSDS"

x.DaSubType == subtypedetail.FirstOrDefault().ClassKey has a value of "IHS"

x.DaNumber == daNumber has a value of "201706218360"

但是,如果我将鼠标悬停在指控列表上,结果视图会显示“枚举未产生任何结果”。

当我查看基础时,Current 和 System.Collections.IEnumerator.Current 一样为 null。

当我查看枚举器时,Current 为 null 而 System.Collections.IEnumerator.Current 为

System.Collections.IEnumerator.Current  '((System.Linq.Enumerable.WhereListIterator<CaseCompass.Intake.NewIntakeHelper.AllegationHelper>)allegationlist).enumerator.System.Collections.IEnumerator.Current' threw an exception of type 'System.InvalidOperationException'   object {System.InvalidOperationException}

如果我深入了解 System.Collections.IEnumerator.Current 基本状态:

{"Enumeration has either not started or has already finished."} System.SystemException {System.InvalidOperationException} 

堆栈跟踪状态:

    StackTrace  "   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)\r\n   at System.Collections.Generic.List`1.Enumerator.System.Collections.IEnumerator.get_Current()"    string

还有一个包含以下信息的列表部分:

[0] {CaseCompass.Intake.NewIntakeHelper.AllegationHelper}   CaseCompass.Intake.NewIntakeHelper.AllegationHelper
        AllegationId    {58323453-1ee3-4cef-ba2a-e1da6fd95c16}  System.Guid
        AllegationName  "Contract"  string
        DaNumber    "201706218360"  string
        DaSubType   "In-Home Services"  string
        DaType  "Complaint-DSDS"    string
        GridRowIndex    0   int
        Indicators  Count = 1   System.Collections.Generic.List<string>
        ParentGridRowIndex  0   int
        SubtypeId   "bf713051-359a-4091-9f0f-afa5019304e9"  string
        Typeid  "3cdc658e-947c-497c-8fb1-2bb9dc026baa"  string

在源代码部分也可以找到相同的信息

我已经在 Google 上搜索了各种错误消息,但我没有足够的经验将我正在阅读的内容与我的代码联系起来。

【问题讨论】:

  • 显然数据源中没有一项符合您指定的条件。您成功计算出您的条件使用的值这一事实并不意味着会有任何匹配它的项目。
  • daSubType "In-Home Services" 与 x.daSubType = "IHS" 不匹配,因为您使用的是 &&,所以必须匹配。
  • @Kevin - 我的变量中的数据正在与源进行核对,这是正确的吗?
  • Where 子句检查是否有任何指控 (x) 成员满足所有检查。由于您使用的是逻辑与 (&&),因此所有检查都必须为真,才能将指控成员添加到结果中。
  • 小心那些FirstOrDefault 在你的条件下调用,因为它们可以返回null 并且你将访问一个空引用的成员。如果您知道它们永远不会为空,请改用First(或者如果应该只有一项,请使用Single)。这样,当没有找到第一个元素时,可以引发适当的异常。否则使用空传播+合并来保护您的条件。我们需要的最后一件事是这里的另一个“什么是 NRE”欺骗问题 :)

标签: c# linq ienumerable generic-collections


【解决方案1】:

你看错了。当您将鼠标悬停在变量上时,它会给您结果,但基于此:

x.DaType == datype.FirstOrDefault().IntakeServReqTypeKey has a value of "Complaint-DSDS"

你没有看对的东西。布尔比较不能有“投诉-DSDS”的值。可能是truefalse。检查x.DaType 的值与datype 列表中第一项的IntakeServReqTypeKey 的值是多少。对WHERE 子句中的每个位置执行此操作。

希望有意义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2018-08-09
    相关资源
    最近更新 更多