我必须完成一个项目,但我有一个简单的问题
我有一个以这种方式定义的类
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指令)或汇编参考?)
答案 0 :(得分:4)
您的GroupId
类仅实现非泛型IEnumerable
类 - 如果要使用LINQ扩展方法,则应实现IEnumerable<T>
。 (无论如何,这通常都是一种更好的体验。)
请注意,如果您使用通用IList<T>
而不是非通用IList
,这也会更容易 - 基本上尽量避免在新代码中使用非泛型集合,如果可能的话
您可以使用Cast
将IEnumerable
转换为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>