C# Indexer и Linq

У меня есть свойство в классе:

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

Но я не могу использовать этот класс в Linq. Как это сделать?

2 ответа

Решение

Если ваш класс не реализует IEnumerable, но имеет индексатор и свойство Count, вы можете создать IEnumerable из индексов, используя метод Enumerable.Range, и спроецировать каждый индекс в элемент коллекции, используя метод расширения 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() являются наилучшей практикой при переносе массива, но они должны работать.

Другие вопросы по тегам