2

クラスにプロパティがあります:

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

しかし、Linq でこのクラスを使用することはできません。作り方は?

4

2 に答える 2

12

クラスがIEnumerable<T>を実装していないが、インデクサーとCountプロパティがある場合は、 Enumerable.Range Methodを使用してインデックスの 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 に答える