如何在空列表上使用空条件运算符?
How to use the null-conditional operator on an empty list?
我有一个对象(在此示例中保持简单),例如:
public class MyObject
{
public ICollection<OtherObject> OtherObjects { get; set; }
}
public class OtherObject
{
public bool IsValid() { return true; }
}
目前在我的代码中我这样做:
bool ok = false;
if (myObject.OtherObjects != null && myObject.OtherObjects.Count > 0)
{
var last = myObject.OtherObjects.Last();
ok = last.IsValid();
}
现在,使用 C#6.0,可以在一行代码中完成此操作:
bool? ok = myObject.OtherObjects?.Last()?.IsValid();
但是,在这种情况下,null 条件运算符将不起作用,因为上面的 returns 是一个异常
The sequence contains no elements.
所以在这种情况下,我是否还需要使用旧方法来检查空值而不是使用空值条件运算符的新方法?
或者有更好的方法吗?
该列表不包含任何元素,但它不是 null
,否则您会得到一个 NullReferenceException
。您可以做的是将其更改为类似的内容:
bool? ok = myObject.OtherObjects?.Any() ?? false && myObject.OtherObjects.Last().IsValid();
如@Jeroen 所述,空条件运算符与 LastOrDefault()
结合得很好。
你可以简单地做:
bool ok = myObject.OtherObjects?.LastOrDefault()?.IsValid() ?? false;
我有一个对象(在此示例中保持简单),例如:
public class MyObject
{
public ICollection<OtherObject> OtherObjects { get; set; }
}
public class OtherObject
{
public bool IsValid() { return true; }
}
目前在我的代码中我这样做:
bool ok = false;
if (myObject.OtherObjects != null && myObject.OtherObjects.Count > 0)
{
var last = myObject.OtherObjects.Last();
ok = last.IsValid();
}
现在,使用 C#6.0,可以在一行代码中完成此操作:
bool? ok = myObject.OtherObjects?.Last()?.IsValid();
但是,在这种情况下,null 条件运算符将不起作用,因为上面的 returns 是一个异常
The sequence contains no elements.
所以在这种情况下,我是否还需要使用旧方法来检查空值而不是使用空值条件运算符的新方法?
或者有更好的方法吗?
该列表不包含任何元素,但它不是 null
,否则您会得到一个 NullReferenceException
。您可以做的是将其更改为类似的内容:
bool? ok = myObject.OtherObjects?.Any() ?? false && myObject.OtherObjects.Last().IsValid();
如@Jeroen 所述,空条件运算符与 LastOrDefault()
结合得很好。
你可以简单地做:
bool ok = myObject.OtherObjects?.LastOrDefault()?.IsValid() ?? false;