如何将LINQ与动态集合一起使用

时间:2013-09-11 07:20:11

标签: c# linq

有没有办法将dynamic对象转换为IEnumerable类型以过滤带属性的集合。

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

我需要访问类似这样的内容

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

任何想法?

4 个答案:

答案 0 :(得分:98)

只要data是某种IEnumerable,您就可以使用:

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

Cast<dynamic>()最终会得到IEnumerable<dynamic>,因此lambda表达式的参数类型也是dynamic

答案 1 :(得分:39)

尝试转换为IEnumerable<dynamic>

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

这种方法比其他方法快4倍。

祝你好运

答案 2 :(得分:0)

如果可以的话,理想的解决方案是在反序列化时指定类型,以避免以后再进行转换。这比上面建议的方法干净得多。

所以,如果您有-

venv

然后只需将其更改为-

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

答案 3 :(得分:0)

这可能会有所帮助,将 jsonString 替换为 response.Content 并根据您的响应内容在需要时使用嵌套循环。

在下面的代码中,JValue.Parse 将返回 IEnumerable 的 JToken

        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();