Как определить что коллекция поддерживает доступ по индексу?
От: Аноним  
Дата: 16.07.09 21:32
Оценка:
Задача в том, что есть коллекция и нужно в ней поменять объекты. Коллекция может быть любой (наследник от ICollection<T>). Если коллекция поддерживает доступ по индексу, нужно заменить объект, а если нет, то поменять объект методами Remove/Add. Есть вариант пытаться приводить коллекцию к IList<T>, и если она приводится, то менять объекты по индексу.
Но насколько это общий подход к решению проблемы?
Есть ли какой-нибудь наследник от ICollection<T>, который не являет наследников от IList<T>, но при этом поддерживает доступ по индексу?
Как решить эту задачу в общем виде, чтобы если коллекция поддерживает доступ по индексу, использовать его? (Как решить задачу с рефшлекшеном знаю, но этот вариант мне не очень нравится).
Re: Как определить что коллекция поддерживает доступ по инде
От: _FRED_ Черногория
Дата: 17.07.09 04:48
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А> Задача в том, что есть коллекция и нужно в ней поменять объекты. Коллекция может быть любой (наследник от ICollection<T>). Если коллекция поддерживает доступ по индексу, нужно заменить объект, а если нет, то поменять объект методами Remove/Add.


А>Есть вариант пытаться приводить коллекцию к IList<T>, и если она приводится, то менять объекты по индексу.

А> Но насколько это общий подход к решению проблемы?

"приводить" с помощью as — вполне нормальный и общепонятный подход.

А> Есть ли какой-нибудь наследник от ICollection<T>, который не являет наследников от IList<T>, но при этом поддерживает доступ по индексу?


Тут уже начнётся колдовство: можно с помощью reflection проверить наличие индексера с нужной сигнатурой. Например, IDictionary<int, TSmth> так же будет иметь целочисленный индексер, но нужен ли он вам? Толи будет делать этот индексер что надо — большой вопрос. Обычно, если коллекция позволяет доступ по индексу (за приемлемое, обычно константное, время), то коллекция реализует IList<> — лист во фреймворке собственно и олицетворяет коллекцию, поддерживающую доступ по индексу.

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


var list = collection as IList<T>;
if(list != null) {
  // …
} else {
  // …
}//if
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Как определить что коллекция поддерживает доступ по и
От: Аноним  
Дата: 17.07.09 09:13
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Аноним, Вы писали:


А>> Задача в том, что есть коллекция и нужно в ней поменять объекты. Коллекция может быть любой (наследник от ICollection<T>). Если коллекция поддерживает доступ по индексу, нужно заменить объект, а если нет, то поменять объект методами Remove/Add.


А>>Есть вариант пытаться приводить коллекцию к IList<T>, и если она приводится, то менять объекты по индексу.

А>> Но насколько это общий подход к решению проблемы?

_FR>"приводить" с помощью as — вполне нормальный и общепонятный подход.


А>> Есть ли какой-нибудь наследник от ICollection<T>, который не являет наследников от IList<T>, но при этом поддерживает доступ по индексу?


_FR>Тут уже начнётся колдовство: можно с помощью reflection проверить наличие индексера с нужной сигнатурой. Например, IDictionary<int, TSmth> так же будет иметь целочисленный индексер, но нужен ли он вам? Толи будет делать этот индексер что надо — большой вопрос. Обычно, если коллекция позволяет доступ по индексу (за приемлемое, обычно константное, время), то коллекция реализует IList<> — лист во фреймворке собственно и олицетворяет коллекцию, поддерживающую доступ по индексу.


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


_FR>
_FR>var list = collection as IList<T>;
_FR>if(list != null) {
_FR>  // …
_FR>} else {
_FR>  // …
_FR>}//if
_FR>


Спасибо. Как раз про этот вариант я писал в своем сообщении. Я просто нее был уверен, что все коллекции объектов (именно одиночных объектов, а не словарь) поддерживают IList<>.
Re[3]: Как определить что коллекция поддерживает доступ по и
От: _FRED_ Черногория
Дата: 17.07.09 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А> Спасибо. Как раз про этот вариант я писал в своем сообщении. Я просто нее был уверен, что все коллекции объектов (именно одиночных объектов, а не словарь) поддерживают IList<>.


Что касается стандартных коллекций, то они могут не поддерживать IList<>, а поддерживать IList. Что касается оверквотинга, то тут ты не прав
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.