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 指令或程序集参考?)

4

2 回答 2

4

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

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

可以使用Cast将您的转换IEnumerableIEnumerable<T>这样的:

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

...但是让你的类实现会更好IEnumerable<Intero>

于 2012-01-17T10:56:25.727 回答
2

因为你_groupId1被声明为一个IList,这只是一个IEnumerable

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

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

或将其声明为IList<Intero>

于 2012-01-17T10:56:55.793 回答