我有这样的代码:
BenefitValue = premiumResponseMessage.results[0].subItems[0]
.profiles[0].subItems[0].profiles[0].subItems[0].profiles[0]
.subItems[0].profiles[index].values[0]
此处指定的值是从某个服务返回的。我的问题是我需要在使用之前检查每个项目是否为null。如何使用LINQ使用最少的代码行来实现?
答案 0 :(得分:2)
你永远不应该做你想做的事。你打破了Law of Demeter
。
3级下来,你会伸展它,但你的10级水平真的非常糟糕。
如果你真的必须,那么把它分解成小功能。 我看到subItems和Profiles重演了。
并解释“水平”:
这将是三个层次:
//1 2 3
BenefitValue = premiumResponseMessage.results[0].subItems[0].profiles[0];
你的深度是10级:
//1 2 3 ....
BenefitValue = premiumResponseMessage.results[0].subItems[0].profiles[0].subItems[0].profiles[0].subItems[0].profiles[0].subItems[0].profiles[index].values[0]
答案 1 :(得分:1)
你应该考虑Andre Snede Hansen所写的内容。看来你需要的是递归的总和类型。
无论如何,你的linq查询看起来像这样:
BenefitValue = from message in premiumResponseMessage.Reuslts.Take(1)
where message != null
from subItem1 in message.SubItems.Take(1)
where subItem1 != null
from profile1 in subItem1.Profiles.Take(1)
where profile1 != null
from subItem2 in profile1.SubItems.Take(1)
where subItem2 != null
... etc.. etc
正如你所看到的,这仍然是丑陋的地狱。考虑使用递归函数,将X值深入检索到配置文件
private BenefitValueType GetValueForProfile(SubItemType item, int level, int index)
{
if ((item == null) || (item.Profiles[0] == null))
{
return null;
}
else if (level == 0)
{
return item.Profiles[index] != null
? item.Profiles[index].Value[0]
: null;
}
else
{
return GetValueForProfile(item.Profiles[0].SubItems[0], level - 1, index);
}
}
请注意,我没有测试代码,参数验证也没有...
答案 2 :(得分:0)
Here's使用LINQ检查空值的几种方法。 但我认为这可能是你需要的(上面的链接中的第一个例子):
var titleless = items.Where(x => x.Title == null);
答案 3 :(得分:-1)
检查它们的最快方法,你可以使用Try,Catch(NullReferenceException)