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

3

我需要完成一个项目,但是我遇到了一个简单的问题。

我定义了一个这样的类

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' 的内容,也没有接受类型为 '...GroupId' 的第一个参数的扩展方法 'Intersect' 可用(是否缺少 using 指令或程序集引用?)


我假设 Using System.Linqusing System.Linq; 的打字错误(小写的 using 和末尾的分号)。 - ChrisF
2个回答

4

你的 GroupId 类只实现了非泛型的 IEnumerable 类,如果你想使用 LINQ 扩展方法,应该实现 IEnumerable<T>。这通常会提供更好的体验。

请注意,如果你使用泛型的 IList<T> 而不是非泛型的 IList,那么实现泛型接口将更容易 - 在新代码中尽可能避免使用非泛型集合。

你可以使用 Cast 将你的 IEnumerable 转换为 IEnumerable<T>,如下所示:

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

...但是更好的方式是让你的类实现IEnumerable<Intero>接口。


2

由于您的_groupId1声明为一个IList,而这只是一个IEnumerable

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

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

或将其声明为IList<Intero>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接