2011-03-03 14 views
0

我很困惑集合和IEnumerable类型。任何一个可以解释为什么第一次查询是错误的,但第二个是正确─
一号通这给了错误给定的LINQ到收集查询有什么区别?

ConditionFieldCollection conditionColl = (ConditionFieldCollection)Session["ConditionFieldCollection"]; 
ConditionFieldCollection cnd = new ConditionFieldCollection(); 
cnd = (from c in conditionColl 
      where iq.QueryField == c.Expression 
       select c); 

2日 - 正常工作

ConditionFieldCollection conditionColl = (ConditionFieldCollection)Session["ConditionFieldCollection"]; 
List<ConditionField> cnd = (from c in conditionColl.OfType<ConditionField>() 
             where iq.QueryField == c.Expression 
             select c).ToList(); 

我知道LINQ回报IEnumerable类型的集合对象,但ConditionFieldCollection也是一个集合,那么为什么它在编译时给我错误。有没有什么区别B/W Collecton和IEnumerable Collection?

回答

3

您正试图分配IEnumerable<ConditionField>给一个变量与ConditionFieldCollection类型 - 这是行不通的。一个枚举不是一个集合,当然不是具体的集合。

许多藏品允许枚举的构造函数,所以这可能工作:

ConditionFieldCollection cnd = new ConditionFieldCollection(
    from c in conditionColl 
    where iq.QueryField == c.Expression 
    select c); 
0

仅仅因为ConditionFieldCollection是一个集合并不意味着它与查询的返回值是相同的集合。

这好像是说

class Mammal{} 
class Dog : Mammal {} 
class Cat : Mammal {} 

Dog d = new Dog(); 
Cat c = new Cat(); 
d = c; // Wrong, even though they are both mammals they are not the same kind of mammal. 

编辑
根据如何ConditionFieldCollection运作的,你可以有两个选择,希望其中至少有一个工作。

ConditionFieldCollection cnd = new ConditionFieldCollection(); 
cnd.AddRange(from c in conditionColl 
      where iq.QueryField == c.Expression 
      select c); 

ConditionFieldCollection cnd = 
    new ConditionFieldCollection(from c in conditionColl 
           where iq.QueryField == c.Expression 
           select c);