Как мне конвертировать это? - PullRequest
2 голосов
/ 17 декабря 2010

Как лучше всего выполнить индексацию в

IEnumerable<T>

У нас много кода, который перемещается с

 IList<T>

и мы хотим изменить их на:

IEnumerable<T>

потому что мы хотим, чтобы они были только для чтения, но у нас есть несколько частей кода, таких как:

item.Dates[0]

или

item.Dates[i]

(в цикле).

Какой рекомендуемый путь конвертации здесь?

Ответы [ 3 ]

6 голосов
/ 17 декабря 2010

Самый быстрый и самый грязный способ получить то, что вам нужно, это использовать класс ReadOnlyCollection<T>.Это может быть представлено как IList<T> реализация (так что вы получаете произвольный доступ по индексу, по желанию), но на самом деле только для чтения (так что методы, которые обычно изменяют коллекцию - например, Add, Insert и т. Д.). - вместо этого выбрасывать исключения).

Вы можете альтернативно спроектировать свой собственный интерфейс, что-то вроде IArray<T>, который наследуется от IEnumerable<T>, а также предоставляет this[int index] getter *Только 1015 *.

Но тогда вам нужно написать обертку для этого, чтобы сделать ее вообще полезной.К сожалению, большая часть кода взаимодействует с интерфейсом IList<T> только для произвольного доступа (не изменчивости), поэтому его использование, вероятно, станет для вас способом наименьшего сопротивления.

3 голосов
/ 17 декабря 2010

Если вам нужна коллекция с индексаторами, но вам нужно что-то только для чтения, используйте ReadOnlyCollection<T>.

0 голосов
/ 17 декабря 2010

Используйте LINQ выражений или циклов foreach. Индексирование может привести к множеству ошибок и небрежному коду.

В противном случае выполните ToArray для вашего IEnumerable, а затем индексируйте.

IEnumerable - это просто объект, который поддерживает перечисление. Он не обязательно поддерживает индексацию, и поэтому вы не можете индексировать объект.

Пример, с IEnumerable:

//item.Dates[0];
item.Dates.FirstOrDefault();
//item.Dates[i] in a loop
item.Dates.Select(/*some projection*/);
//or
foreach (var date in item.Dates)
{
    //some action with side effects
}
...