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 ?的主要内容,如果未能解决你的问题,请参考以下文章
NET问答: 如何从 event 中移除所有的 handler ?
NET问答: 如何使用 C# 比较两个 byte[] 的相等性 ?