我在一个类中有一个属性:
public int this[int index]
{
get { return _desk[index]; }
set { _desk[index] = value; }
}
但我不能在 Linq 中使用这个类。怎么做?
如果您的类没有实现IEnumerable<T>但具有索引器和Count属性,则可以使用Enumerable.Range 方法创建索引的 IEnumerable ,并使用Enumerable.Select 扩展方法将每个索引投影到集合项:
var query = Enumerable.Range(0, obj.Count)
.Select(index => obj[index])
...
索引器不会自动为您提供枚举。为了能够调用 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()
包装数组时的实现是否是最佳实践,但它们应该可以工作。