C# 如何在动态集合中使用LINQ

C# 如何在动态集合中使用LINQ,c#,linq,C#,Linq,是否有方法将动态对象转换为IEnumerable类型以使用属性筛选集合 dynamic data = JsonConvert.DeserializeObject(response.Content); 我需要访问这样的东西 var a = data.Where(p => p.verified == true) 有什么想法吗?试着转换成IEnumerable ((IEnumerable)数据),其中(d=>d.Id==1); 这种方法比其他方法快4倍 祝你好运只要数据是某种类型的IEnu

是否有方法将
动态
对象转换为
IEnumerable
类型以使用属性筛选集合

dynamic data = JsonConvert.DeserializeObject(response.Content);
我需要访问这样的东西

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

有什么想法吗?

试着转换成
IEnumerable

((IEnumerable)数据),其中(d=>d.Id==1);
这种方法比其他方法快4倍


祝你好运

只要
数据
是某种类型的
IEnumerable
,你就可以使用:

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

Cast()
以一个
IEnumerable
结束,这样lambda表达式的参数类型也是
dynamic

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

所以如果你有-

dynamic data = JsonConvert.DeserializeObject(response.Content);
然后简单地将此更改为-

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

这可能会有所帮助,用response.Content替换jsonString,如果需要,根据您的响应内容使用嵌套循环

在下面的代码中,JValue.Parse将返回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();

您可以使用@Jon提供的解决方案和您的解决方案有什么区别吗Skeet@HosseinNarimaniRadNET中可枚举类的Cast方法将传递的IEnumerable(本例中为数据)的每个成员强制转换为某个对象(本例中为动态对象),因此,如果您的数据有1000个项,则该代码将执行1000次强制转换,但是我的代码只有一个类型。缺点是这不适用于
IEnumerable
,其中
t
是值类型,例如
List
。“有时候这可能是相关的,有时候则不是。”JonSkeet我很想知道你对Yasser的答案有什么看法。有什么显著的区别吗?@HosseinNarimaniRad:是的,我的会工作,即使它是一个值类型的序列;亚西尔的不会。我添加了一条注释。如问题所述,“将动态对象转换为IEnumerable”在哪里?此解决方案是一种替代方法,无需将动态对象转换为IEnumerable。Parse将返回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();