NET问答: 如何在 dynamic 集合上使用 Linq ?

咨询区

  • user1618825

有没有一种方式可以将 dynamic 对象转成 可过滤的 IEnumerable 类型对象?比如下面的代码:


dynamic data = JsonConvert.DeserializeObject(response.Content);

然后用Linq去访问


var a = data.Where(p => p.verified == true)

回答区

  • Jon Skeet

只要 data 是某一种 IEnumerable 类型,就可以像下面这样用。


var a = ((IEnumerable) data).Cast<dynamic>().Where(p => p.verified);

这里用 Cast<dynamic>() 的目的就是将 data 转成 IEnumerable<dynamic>,好处在于 lambda 表达式 中的参数也是 动态类型。

  • user3407039

如果可以的话,理想的方式是反序列化时指定好类型,这样就可以避免后期再 Cast,比如下面的代码:


dynamic data = JsonConvert.DeserializeObject(response.Content);

可以改造成


var data = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(response.Content);

  • Varun Nair

这里我提供一些思路可能对你有帮助,用 jsonString 作为 response.Content ,必要的话再在 response 中做迭代过滤。

下面的代码通过 JValue.Parse 来返回 JToken,这里的 JToken 就是 IEnumerable.


        string jsonString = "[{\"Question\":{\"QuestionId\":49,\"QuestionText\":\"Whats your name?\",\"Answer\":\"xyz\"}},{\"Question\":{\"QuestionId\":51,\"QuestionText\":\"Are you smart?\",\"Answer\":\"Yes\"}}]";
        dynamic myObject = JValue.Parse(jsonString);
        foreach (dynamic questions in myObject)
        {
            Console.WriteLine(questions.Question.QuestionId + "." + questions.Question.QuestionText.ToString());
            Console.WriteLine("Ans. " +questions.Question.Answer);
            Console.WriteLine();
        }
        Console.Read();

点评区

其实我觉得既然都用了 JsonConvert ,直接用它内置的 JObject,JToken 来动态解析 json 即可,就如 Varun Nair 所述,简单粗暴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值