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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 所述,简单粗暴。

以上是关于NET问答: 如何在 dynamic 集合上使用 Linq ?的主要内容,如果未能解决你的问题,请参考以下文章

Dapper 动态集合上的动态 Linq - 可能吗?

NET问答: 如何从 event 中移除所有的 handler ?

NET问答: 如何使用 C# 比较两个 byte[] 的相等性 ?

NET问答: 如何使用 C# 直接从 JSON String 中提取特定值 ?

NET问答: 如何取消或中止 Task 执行 ?

NET问答: 如何实现读写 file 的时候不用锁模式 ?