我在课堂上有一个属性:
public int this[int index]
{
get { return _desk[index]; }
set { _desk[index] = value; }
}
但我不能在Linq使用这个课程。如何制作?
答案 0 :(得分:10)
如果您的类未实现IEnumerable<T>但具有索引器和 Count 属性,则可以使用Enumerable.Range Method创建IEnumerable索引,并为每个索引投影使用Enumerable.Select Extension Method:
收集项目var query = Enumerable.Range(0, obj.Count)
.Select(index => obj[index])
...
答案 1 :(得分:3)
索引器不会自动为您提供枚举。为了能够调用LINQ方法,您需要在类上实现IEnumerable<int>
。
我假设你的_desk
对象是一个简单的数组 - 如果我错了,_desk
是其他具有索引器的类,你可能需要这样做类实现IEnumerable<int>
。
然后你需要做这样的事情:
public class Position : IEnumerable<int>
{
private int[] _desk;
public int this[int index]
{
get { return _desk[index]; }
set { _desk[index] = value; }
}
/* the rest of your class */
public IEnumerator<int> GetEnumerator()
{
return ((IEnumerable<int>)_desk).GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return _desk.GetEnumerator();
}
}
我不知道在包装数组时GetEnumerator()
的实现是否是最佳实践,但它们应该有效。