我有一系列项目
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。
然而......这看起来很丑陋,而且非常简单,它正在滴水......
对此有更优雅的解决方案吗?
答案 0 :(得分:2)
看起来SomeProperty
是string
,您希望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
}