尝试迭代 IEnumerator 时出现 NullReferenceException 错误
NullReferenceException Error when trying to iterate a IEnumerator
我有一个数据表,想 select 使用 LinQ 以这种格式记录一些记录:
var result2 = from row in dt.AsEnumerable()
where row.Field<string>("Media").Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
&& (String.Compare(row.Field<string>("StrDate"), dtStart.Year.ToString() +
(dtStart.Month < 10 ? '0' + dtStart.Month.ToString() : dtStart.Month.ToString()) +
(dtStart.Day < 10 ? '0' + dtStart.Day.ToString() : dtStart.Day.ToString())) >= 0
&& String.Compare(row.Field<string>("StrDate"), dtEnd.Year.ToString() +
(dtEnd.Month < 10 ? '0' + dtEnd.Month.ToString() : dtEnd.Month.ToString()) +
(dtEnd.Day < 10 ? '0' + dtEnd.Day.ToString() : dtEnd.Day.ToString())) <= 0)
group row by new { Year = row.Field<int>("Year"), Month = row.Field<int>("Month"), Day = row.Field<int>("Day") } into grp
orderby grp.Key.Year, grp.Key.Month, grp.Key.Day
select new
{
CurrentDate = grp.Key.Year + "/" + grp.Key.Month + "/" + grp.Key.Day,
DayOffset = (new DateTime(grp.Key.Year, grp.Key.Month, grp.Key.Day)).Subtract(dtStart).Days,
Count = grp.Sum(r => r.Field<int>("Count"))
};
在此代码中,我尝试使用以下代码对其进行迭代:
foreach (var row in result2)
{
//... row.DayOffset.ToString() + ....
}
出现此问题:
对象引用未设置为对象的实例。
我认为当没有符合上述条件的记录时就会发生这种情况。
我试图将其更改为这样的枚举器,并使用 MoveNext() 检查数据是否在上面:
result2.GetEnumerator();
if (enumerator2.MoveNext()) {//--}
但还是一样的错误。
有什么问题吗?
我猜在一行或多行中 Media
是 null
。
然后您在 null
上调用 Equals
,结果是 NullReferenceException
。
您可以添加空检查:
var result2 = from row in dt.AsEnumerable()
where row.Field<string>("Media") != null
&& row.Field<string>("Media").Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
...
或使用替代值,例如:
var result2 = from row in dt.AsEnumerable()
let media = row.Field<string>("Media") ?? String.Empty
where media.Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
...
(注意最后的做法略有不同)
我有一个数据表,想 select 使用 LinQ 以这种格式记录一些记录:
var result2 = from row in dt.AsEnumerable()
where row.Field<string>("Media").Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
&& (String.Compare(row.Field<string>("StrDate"), dtStart.Year.ToString() +
(dtStart.Month < 10 ? '0' + dtStart.Month.ToString() : dtStart.Month.ToString()) +
(dtStart.Day < 10 ? '0' + dtStart.Day.ToString() : dtStart.Day.ToString())) >= 0
&& String.Compare(row.Field<string>("StrDate"), dtEnd.Year.ToString() +
(dtEnd.Month < 10 ? '0' + dtEnd.Month.ToString() : dtEnd.Month.ToString()) +
(dtEnd.Day < 10 ? '0' + dtEnd.Day.ToString() : dtEnd.Day.ToString())) <= 0)
group row by new { Year = row.Field<int>("Year"), Month = row.Field<int>("Month"), Day = row.Field<int>("Day") } into grp
orderby grp.Key.Year, grp.Key.Month, grp.Key.Day
select new
{
CurrentDate = grp.Key.Year + "/" + grp.Key.Month + "/" + grp.Key.Day,
DayOffset = (new DateTime(grp.Key.Year, grp.Key.Month, grp.Key.Day)).Subtract(dtStart).Days,
Count = grp.Sum(r => r.Field<int>("Count"))
};
在此代码中,我尝试使用以下代码对其进行迭代:
foreach (var row in result2)
{
//... row.DayOffset.ToString() + ....
}
出现此问题: 对象引用未设置为对象的实例。
我认为当没有符合上述条件的记录时就会发生这种情况。 我试图将其更改为这样的枚举器,并使用 MoveNext() 检查数据是否在上面:
result2.GetEnumerator();
if (enumerator2.MoveNext()) {//--}
但还是一样的错误。
有什么问题吗?
我猜在一行或多行中 Media
是 null
。
然后您在 null
上调用 Equals
,结果是 NullReferenceException
。
您可以添加空检查:
var result2 = from row in dt.AsEnumerable()
where row.Field<string>("Media") != null
&& row.Field<string>("Media").Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
...
或使用替代值,例如:
var result2 = from row in dt.AsEnumerable()
let media = row.Field<string>("Media") ?? String.Empty
where media.Equals(MediaTp, StringComparison.CurrentCultureIgnoreCase)
...
(注意最后的做法略有不同)