我可以使用Linq以比这更优雅的方式从集合中获取属性吗?

时间:2014-02-07 10:51:03

标签: c# linq nullreferenceexception

我有一系列项目

List<Thing> MyListOfThings

我使用像这样的PetaPoco从数据库中获取此列表

var MyListOfThings = db.Fetch<Thing>();

然后我想得到这样一个属性的值:

otherObject.Value = MyListOfThings.SingleOrDefault(q => q.UniqueID == otherValue).SomeProperty;

我认为这是一个非常优雅的解决方案,问题是如果集合中不包含UniqueID otherValue的对象。然后它以空引用异常进入BANG。

我一直在使用的解决方案是

otherObject.Value = MyListOfThings.SingleOrDefault(q => q.UniqueID == otherValue) == null
  ? ""
  : MyListOfThings.SingleOrDefault(q => q.UniqueID == otherValue).SomeProperty;

这样做,Resharper仍然抱怨可能存在NullReferenceException,但我想这只是因为它不将第一行计为nullcheck。

然而......这看起来很丑陋,而且非常简单,它正在滴水......

对此有更优雅的解决方案吗?

3 个答案:

答案 0 :(得分:2)

看起来SomePropertystring,您希望string.Empty作为后备值。如果那是对的,那么你可以做到

otherObject.Value = 
    (from thing in MyListOfThings
    where thing.UniqueID == otherValue
    select thing.SomeProperty)
        .SingleOrDefault() ?? string.Empty;

LINQ表达式是IEnumerable<string>,其中包含具有相关SomeProperty的所有Thing的{​​{1}}值;这可能是一个空的可枚举。

答案 1 :(得分:1)

首先使用where语句并使用DefaultIfEmpty设置回退值

otherObject.Value = MyListOfThings
    .Where(q => q.UniqueID == otherValue)
    .Select(q => q.SomeProperty)
    .DefaultIfEmpty("")
    .SingleOrDefault();

答案 2 :(得分:0)

这样做

MyListOfThings object = MyListOfThings.where(q => q.UniqueID == otherValue).FirstOrDefault();

这将获得我的东西的对象或null

if(!object.IsNull) // null check so wont Bang
{
//assign value here
}