2012-05-22 2 views
1

У меня есть свойство в классе:C# индексатор и Linq

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

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

+1

Просьба привести пример того, что вы пытаетесь сделать. Ваш вопрос непонятен. –

+0

Как вы хотите его использовать? Что значит «Я не могу это использовать»? Если индекс является единственным способом доступа к вашим данным, то вы можете рассмотреть возможность внедрения IEnumerable

+2

Что значит «Я не могу использовать этот класс»? Мы не видим ни класса, ни того, как вы его пытаетесь использовать. – Jon

ответ

9

Если ваш класс не реализует IEnumerable<T>, но имеет индексатор и графа собственности, вы можете создать IEnumerable индексов с использованием Enumerable.Range Method, и проект каждого индекса к элементу коллекции с помощью Enumerable.Select Extension Method:

var query = Enumerable.Range(0, obj.Count) 
         .Select(index => obj[index]) 
         ... 
+3

+1, это жизнеспособная альтернатива реализации 'IEnumerable <..>' (особенно если класс не находится под вашим контролем), я не понимаю нисходящее. – Rawling

+1

+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() являются наилучшей практики, когда оберточной массив, но они должны работать.