2015-08-23 25 views
0
var student1 = new {name: "abc"}; 
var student2 = new {name: "efg"} 
var department1 = new { name: "science", location= "ny"} 
var department2 = new { name: "maths", location= "nj"} 
var department3 = new { name: "social", location= "ny"} 

List<dynamic> dynamicList = new List<dynamic>(); 

dynamicList.Add(student1); 
dynamicList.Add(student2); 
dynamicList.Add(department1); 
dynamicList.Add(department2); 
dynamicList.Add(department3); 

现在我想获得总对象的个数在dynamicList其中location =“NY”查询数据,有多种类型的对象

var total = dynamicList.Count(x=> (string)x.location == "ny"); 

这是抛出异常,因为有没有定义位置。


UDPATE:当我有位置属性的对象是冷杉锡名单同LINQ查询工作。

dynamicList.Add(department1); 
    dynamicList.Add(department2); 
    dynamicList.Add(department3); 
    dynamicList.Add(student1); 
    dynamicList.Add(student2); 
var total = dynamicList.Count(x=> (string)x.location == "ny"); 

这可以解决任何错误。

回答

1

如果你使用dynamic类型,你完全可以忘记LINQ和强大的输入。 LINQ的重点在于你正在处理的类型在编译时已知。

为了测试一个动态类型也有一定的属性定义,您将需要trycatch这显然带有相应的性能影响:

var total = dynamicList.Count(x => 
{ 
    try 
    { 
     return (string)x.location == "ny"; 
    } 
    catch (RuntimeBinderException) 
    { 
     return false; 
    } 
}); 

这是说,如果你使用动态类型你的代码,你可能已经习惯了这样的影响你的代码的性能,所以这不会有什么大不了的。

+0

好LINQ的作品当我第一次在列表中有动态物体的位置属性。如果我忘记了LINQ什么是性能问题的替代品 – HaBo

+0

我已经更新了我的答案,以说明您的其他替代方案的性能问题。很明显,因为你选择使用'dynamic'类型,所以你已经在设计中遇到了这样的性能问题,所以我解释的解决方案不会对你有太大的影响。 –

0

您使用的方法很混乱。起初你不恰当地使用匿名类型。而且,LINQ是为了处理泛型而发明的,即在编译时应该知道类型参数以获得LINQ的好处。 无论如何,你可以使用匿名类型的特性,其中,它们的类型由属性名称,类型和顺序决定。因此,

new { name = "", location= ""} 

对象的类型是一样的department对象的类型。

这里是你可以使用代码:

List<dynamic> dynamicList = new List<dynamic> 
{ 
    new {name = "abc"}, 
    new {name = "efg"}, 
    new {name = "science", location= "ny"}, 
    new {name = "maths", location= "nj"}, 
    new {name = "social", location= "ny"}, 
}; 
var type = (new {name = "", location = ""}).GetType(); 
var methodInfo = typeof(Enumerable).GetMethod("OfType"); 
var genericMethod = methodInfo.MakeGenericMethod(type); 
var total = (genericMethod.Invoke(null, new [] {dynamicList}) as IEnumerable<dynamic>) 
      .Count(f => f.location == "ny");