如何在动态集合中使用LINQ


67

有没有一种方法可以将dynamic对象转换为IEnumerableType以使用属性过滤集合。

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

我需要访问这样的内容

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

有任何想法吗?

c#  linq 

您可以使用动态linq
makim

Answers:


119

只要dataIEnumerable某种类型的,就可以使用:

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

Cast<dynamic>()是最终要与IEnumerable<dynamic>使得参数lambda表达式的类型也是dynamic


@JonSkeet我很想知道您对Yasser的回答有何想法。有什么明显的区别吗?
Hossein Narimani Rad 2014年

4
@HosseinNarimaniRad:是的,即使我是一个值类型的序列,我的也可以工作;Yasser不会。我已添加评论。
乔恩·斯基特

48

尝试投射到 IEnumerable<dynamic>

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

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

祝好运


您的解决方案与@Jon Skeet提供的解决方案之间是否有任何区别
Hossein Narimani Rad 2014年

1
.NET中Enumerable类的@HosseinNarimaniRad Cast方法会将传递的IEnumerable(在这种情况下为数据)的每个成员强制转换为某种对象(在这种情况下为动态),因此,如果您的数据有1000个项目,则该代码将执行1000次强制转换,但是我的代码只有一个演员。
Yaser Moradi 2014年

8
不利之处在于,这不适用于值类型为IEnumerable<T>where的地方T,例如List<int>。有时这可能是相关的,而其他时候则不相关。
乔恩·斯基特

0

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

因此,如果您有-

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

然后只需将其更改为-

var data = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(response.Content);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.