【发布时间】: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