为什么我不能在我的类上使用LINQ方法实现IEnumerable?

时间:2012-01-17 10:54:02

标签: c# linq extension-methods intersect

我必须完成一个项目,但我有一个简单的问题

我有一个以这种方式定义的类

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指令)或汇编参考?)

2 个答案:

答案 0 :(得分:4)

您的GroupId类仅实现非泛型IEnumerable类 - 如果要使用LINQ扩展方法,则应实现IEnumerable<T>。 (无论如何,这通常都是一种更好的体验。)

请注意,如果您使用通用IList<T>而不是非通用IList,这也会更容易 - 基本上尽量避免在新代码中使用非泛型集合,如果可能的话

可以使用CastIEnumerable转换为IEnumerable<T>,如下所示:

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

...但是让你的班级实现IEnumerable<Intero>会更好。

答案 1 :(得分:2)

因为您的_groupId1被声明为IList,只是IEnumerable

几乎所有的linq扩展方法都需要一个通用的可枚举(IEnumerable<T>)。您的选择是更改声明,或使用其中一个Cast<T>OfType<T>扩展名。

尝试_groupId1.OfType<Intero>().Intersect(...)

或将其声明为IList<Intero>