Lambda逻辑 - 多重检查

时间:2017-06-13 01:48:43

标签: c# lambda

我努力想要了解任何vs all和多选的逻辑 我有一个从Xelement映射的模型,我想检查多个属性是否有一个值(这是一个有效请求的指示器),但我的检查下面保持返回false(即使我知道他们有值)

 if(!electronicObject.MetaData.All(x=> x.Name.ToLower() == "parcel id" || 
                                                x.Name.ToLower() == "parcel type" ||                                                           x.Name.ToLower() == "street name" ||
                                                      x.Name.ToLower() == "street designation" ||
                                                      x.Name.ToLower() == "parcel status"))

2 个答案:

答案 0 :(得分:0)

在您的代码中,您正在检查元数据中的所有元素是否都被命名为" parcel id"," parcel type"," street name" ,"街道地址"或"包裹状态"。因此,如果您的元数据包含5个元素和1个元素,例如,调用"某些内容",则您的检查将失败。

您希望实现的目标是检查集合中是否有任何可用的属性:

if(electronicObject.MetaData.Any(x=> x.Name.ToLower() == "parcel id" || 
                                      x.Name.ToLower() == "parcel type" ||
                                      x.Name.ToLower() == "street name" ||
                                      x.Name.ToLower() == "street designation" ||
                                      x.Name.ToLower() == "parcel status"))
{
  //your object is probably correct, as it has at least one correct metadata element.
}

即使对于未满的集合,此条件也将返回:" foo"," bar","街道地址"仍然是正确的。我不知道这是不是你想要的

答案 1 :(得分:0)

就像@CodingYoshi说的那样,您似乎更喜欢Any而不是All

因此,您可以这样说:

var categories = new[]{
    "parcel id", 
    "parcel type", 
    "street name", 
    "street designation", 
    "parcel status"
};
var condition = electronicObject.MetaData
                                .Any(x => categories.Contains(x.Name.ToLower()));
if(!condition)
{
    //blah
}