C#Indexer和Linq

时间:2012-05-22 11:58:30

标签: c# linq indexer

我在课堂上有一个属性:

public int this[int index]
        {
            get { return _desk[index]; }
            set { _desk[index] = value; }
        }

但我不能在Linq使用这个课程。如何制作?

2 个答案:

答案 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()的实现是否是最佳实践,但它们应该有效。