Почему я не могу использовать методы LINQ в своем классе, реализующем IEnumerable?

Мне нужно завершить проект, но у меня есть простая проблема

У меня есть класс, определенный таким образом

using System;
using System.Collections;
using System.Collections.Generic;

..

public class GroupId: XmlDataTransferObject, IEnumerable
{
    private IList _groupId;
    private string _nameId;

    public GroupId() : this("GroupId", "Id")
    {
    }

    public GroupId(string rootName, string nomeId) : base(rootName)
    {
        _groupId = new ArrayList();
        _nomeId = nomeId;
    }

    public override bool IsNull
    {
        get { return _groupId.Count == 0; }
    }

    public int Count
    {
        get { return _groupId.Count; }
    }

    public int Add(Intero i)
    {
        return _groupId.Add(i);
    }

    public Intero this[int index]
    {
        get { return (Intero)_groupId[index]; }
        set { _groupId[index] = value; }
    }
...

            public IEnumerator GetEnumerator()
            {
                    return _groupId.GetEnumerator();
            }
}

}

и мне нужно найти пересечение между экземпляром двух объектов GroupId.

Почему я не вижу в доступных методах Linq Intersect, даже если я объявил оператор:

Using System.Linq 

...

var x = _groupId1.Intersect(_groupId2);

...

Ошибка 1 '....GroupId' не содержит определения для 'Intersect', и не может быть найден метод расширения 'Intersect', принимающий первый аргумент типа '...GroupId' (вам не хватает директивы using или сборки? ссылка?)


person Matteo Cherubini    schedule 17.01.2012    source источник
comment
Я предполагаю, что Using System.Linq является опечаткой для using System.Linq; (нижний регистр using и точка с запятой в конце)   -  person ChrisF    schedule 17.01.2012


Ответы (2)


Ваш класс GroupId реализует только неуниверсальный класс IEnumerable — вам следует реализовать IEnumerable<T>, если вы хотите использовать методы расширения LINQ. (В любом случае, как правило, это будет лучший опыт.)

Обратите внимание, что это также будет проще, если вы используете универсальный IList<T> вместо неуниверсального IList - в основном старайтесь полностью избегать неуниверсальных коллекций в новом коде, если это вообще возможно.

Вы можете использовать Cast для преобразования IEnumerable в IEnumerable<T> следующим образом:

var x = _groupId1.Cast<Intero>().Intersect(_groupId2.Cast<Intero>());

... но было бы гораздо лучше просто реализовать в вашем классе IEnumerable<Intero>.

person Jon Skeet    schedule 17.01.2012

Поскольку ваш _groupId1 объявлен как IList, который является всего лишь IEnumerable.

Вам нужен общий перечисляемый (IEnumerable<T>) почти для всех методов расширения linq. Вы можете изменить объявление или использовать одно из расширений Cast<T> или OfType<T>.

попробуй _groupId1.OfType<Intero>().Intersect(...)

или объявить его как IList<Intero>

person Andras Zoltan    schedule 17.01.2012