C# .ToDictionary抛出异常“;NullReferenceException";

C# .ToDictionary抛出异常“;NullReferenceException";,c#,linq,dictionary,C#,Linq,Dictionary,我有下面的代码 .ToDictionary工作异常,并引发错误“找不到对象引用” 如果我像这样替换这个代码 var serviceOptions = serviceDurations.ToDictionary(so => so.OptionCode, StringComparer.OrdinalIgnoreCase); //var serviceLines = serivceLinePayments.Select(sl => new ServiceLine(serviceOptio

我有下面的代码 .ToDictionary工作异常,并引发错误“找不到对象引用”

如果我像这样替换这个代码

var serviceOptions = serviceDurations.ToDictionary(so => so.OptionCode, StringComparer.OrdinalIgnoreCase);

//var serviceLines = serivceLinePayments.Select(sl => new ServiceLine(serviceOptions[sl.option_code], Decimal.ToInt32(sl.quantity), sl.customer_paid_amount));

List<ServiceLine> serviceLines = new List<ServiceLine>();
foreach (var item in serivceLinePayments)
{
var so = serviceOptions.FirstOrDefault(s => s.Value.OptionCode == item.option_code);
ServiceLine line = new ServiceLine( so.Value, Decimal.ToInt32(item.quantity), item.customer_paid_amount);
serviceLines.Add(line);
}
var-serviceOptions=serviceDurations.ToDictionary(so=>so.OptionCode,StringComparer.OrdinalIgnoreCase);
//var serviceLines=serivceLinePayments.Select(sl=>newserviceline(serviceOptions[sl.option\u code],Decimal.ToInt32(sl.quantity),sl.customer\u paid\u amount));
List serviceLines=新列表();
foreach(系列附件中的var项目)
{
var so=serviceOptions.FirstOrDefault(s=>s.Value.OptionCode==item.option\u代码);
ServiceLine line=新的ServiceLine(so.值,小数点到32(项目.数量),项目.客户付款金额);
serviceLines.Add(行);
}

通过使用此代码,没有异常,但无法找出此异常的真正原因。

我相信您的代码行
serviceDurations.ToDictionary(…
正在引发空引用异常,这是明显的原因
serviceDurations
实例由于某种原因是
null
,因此异常


您必须调试并找出为什么
serviceDurations
实例为空。

真的吗?那么为什么第二个代码段中的这一行完全相同?真的吗?不真实?不知道,但可能还有其他什么好的原因导致NRE?我可能遗漏了……您告诉我。我认为编译器以不同的方式处理lambda表达式代码,这与我们以前的方法不同aw(一步一步调试)。在第一行。ToDictionary(…)尝试创建字典,但第二行lamda表达式出现在图片中,并尝试从尚未创建的字典对象获取值。问题是如何处理数据为空的事件?
var serviceOptions = serviceDurations.ToDictionary(so => so.OptionCode, StringComparer.OrdinalIgnoreCase);

//var serviceLines = serivceLinePayments.Select(sl => new ServiceLine(serviceOptions[sl.option_code], Decimal.ToInt32(sl.quantity), sl.customer_paid_amount));

List<ServiceLine> serviceLines = new List<ServiceLine>();
foreach (var item in serivceLinePayments)
{
var so = serviceOptions.FirstOrDefault(s => s.Value.OptionCode == item.option_code);
ServiceLine line = new ServiceLine( so.Value, Decimal.ToInt32(item.quantity), item.customer_paid_amount);
serviceLines.Add(line);
}