【问题标题】:How to do compound conditions in lambda expression如何在 lambda 表达式中做复合条件
【发布时间】:2017-03-28 10:55:20
【问题描述】:

我有以下课程:

public class PriceSelectionsResponse
{
public Prompts Prompts { get; set; }
}

public class Prompts
    {
        public List<Prompt> prompt { get; set; }
    }

public class Prompt
    {
        public int code { get; set; }
        public object level { get; set; }
        public object message { get; set; }
        public object details { get; set; }
    }

现在我想使用 if 条件来检查 prompt level 是否等于“WARN”并且该提示对象在 message 中也包含字符串“HOPPER”。我该怎么做?

我尝试过这种方式,但无法弄清楚。我怎样才能做到这一点?

 if(PriceSelectionsResponseRootObject.Response.PriceSelectionsResponse.Prompts.prompt.Any(p => p.level == "WARN") && PriceSelectionsResponseRootObject.Response.PriceSelectionsResponse.Prompts.prompt.Where(p=>p.message.contains("Hopper")) {

    }

【问题讨论】:

  • 为什么你有一个名为Prompts 的类只包含一个List&lt;Prompt&gt;?为什么不在PriceSelectionsResponse 上直接收藏呢?
  • 错误是什么?看来应该可以了
  • @DarrenYoung 实际上我们正在将 json 请求映射到我们的模型类中,所以无能为力
  • @AlGoreRhythm 对象不包含“包含”的定义
  • 你基本上剥夺了强类型语言的好处。您已经定义了数据类型,在这里您只拥有一个对象的所有内容。如果您将它们设置为字符串,那么您就不会陷入困境。

标签: c# linq lambda contains


【解决方案1】:

您的最后一条语句是说,如果任何提示具有level == "WARN" 并且任何提示具有包含 HOPPER 的消息(不一定与 level = WARNING 相同的提示),则进入 if 块。您要做的是检查 same 提示符是否匹配两个条件:

if(PriceSelectionsResponseRootObject.Response.PriceSelectionsResponse
    .Prompts.prompt.Any(p => p.level.ToString() == "WARN" && p.message.ToString().Contains("HOPPER"))
{
}

【讨论】:

  • 知道为什么我会在 p.level.ToString() == "WARN" 得到“将左手边转换为输入字符串”@
  • @zariakhan 更新了我的答案,level 的类型为 object,因此在将其与字符串进行比较之前,您需要先进行 ToString(),在您的原始帖子中您错过了这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2020-07-26
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多