如何使用LINQ检查所有数组项的空条件

时间:2014-03-05 09:22:55

标签: c# linq

我有这样的代码:

BenefitValue = premiumResponseMessage.results[0].subItems[0]
                    .profiles[0].subItems[0].profiles[0].subItems[0].profiles[0]
                     .subItems[0].profiles[index].values[0]

此处指定的值是从某个服务返回的。我的问题是我需要在使用之前检查每个项目是否为null。如何使用LINQ使用最少的代码行来实现?

4 个答案:

答案 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)