给定LINQ到集合查询有什么区别?

时间:2011-03-03 10:10:00

标签: c# collections ienumerable linq-to-objects

我在收集和IEnumerable类型中非常困惑。任何人都可以解释为什么第一个查询是错误的但第二个是正确的 - 1st-这会给出错误

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

第二名 - 工作正常

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也是一个Collection然后它为什么在编译时给我错误。 b / w Collecton和IEnumerable Collection有什么区别吗?

2 个答案:

答案 0 :(得分:3)

您正在尝试将IEnumerable<ConditionField>分配给类型为ConditionFieldCollection的变量 - 这不起作用。可枚举不是集合,当然不是特定的集合。

许多集合允许使用可枚举的构造函数,因此这可能有效:

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

答案 1 :(得分: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.

修改
根据{{​​1}}的工作原理,您可能有两种选择,希望其中至少有一种可以使用。

<强> 1

ConditionFieldCollection

<强> 2

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