2

我在一个类中有一个属性:

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

但我不能在 Linq 中使用这个类。怎么做?

4

2 回答 2

12

如果您的类没有实现IEnumerable<T>但具有索引器和Count属性,则可以使用Enumerable.Range 方法创建索引的 IEnumerable ,并使用Enumerable.Select 扩展方法将每个索引投影到集合项:

var query = Enumerable.Range(0, obj.Count)
                      .Select(index => obj[index])
                      ...
于 2012-05-22T12:01:15.487 回答
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()包装数组时的实现是否是最佳实践,但它们应该可以工作。

于 2012-05-22T12:17:27.983 回答