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

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

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

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, даже если я объявил оператор:

Using System.Linq 

...

var x = _groupId1.Intersect(_groupId2);

...

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

Ответы [ 2 ]

4 голосов
/ 17 января 2012

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

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

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

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

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

2 голосов
/ 17 января 2012

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

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

try _groupId1.OfType<Intero>().Intersect(...)

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

...