Какая разница в данном LINQ для запроса коллекции? - PullRequest
0 голосов
/ 03 марта 2011

Я довольно запутан в коллекциях и IEnumerable типах. Может ли кто-нибудь объяснить, почему 1-й запрос неправильный, а 2-й правильный -
1-й - это дает ошибку

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 также является коллекцией, тогда почему она дает мне ошибку во время компиляции. Есть ли разница ч / б Collecton и IEnumerable Collection ??

Ответы [ 2 ]

3 голосов
/ 03 марта 2011

Вы пытаетесь присвоить IEnumerable<ConditionField> переменной типа ConditionFieldCollection, которая не может работать.Перечислимый не является коллекцией, и, конечно, не является специфической коллекцией.

Во многих коллекциях допускается перечислимый конструктор, поэтому это может работать:

ConditionFieldCollection cnd = new ConditionFieldCollection(
    from c in conditionColl
    where iq.QueryField == c.Expression
    select c);
0 голосов
/ 03 марта 2011

То, что 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, у вас может быть два варианта, надеюсь, по крайней мере один из них будет работать.

1

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

2

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