我在收集和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有什么区别吗?
答案 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);