如何在动态集合中使用 LINQ

是否有方法将 dynamic对象转换为 IEnumerable类型,以便使用属性筛选集合。

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

我需要访问这样的东西

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

有什么想法吗?

47100 次浏览

Try casting to IEnumerable<dynamic>

((IEnumerable<dynamic>)data).Where(d => d.Id == 1);

This approach is 4x faster than other approachs.

good luck

So long as data is an IEnumerable of some kind, you can use:

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

The Cast<dynamic>() is to end up with an IEnumerable<dynamic> so that the type of the parameter to the lambda expression is also dynamic.

If you are able to, the ideal solution is to specify the type when deserializing, so to avoid having to cast later. This is a lot cleaner than the approaches suggested above.

So if you have -

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

Then simply change this to -

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

This might help, replace jsonString with response.Content and use nested loops if required based on your response content.

In the below code JValue.Parse will return JToken which is 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();