Задача в том, что есть коллекция и нужно в ней поменять объекты. Коллекция может быть любой (наследник от ICollection<T>). Если коллекция поддерживает доступ по индексу, нужно заменить объект, а если нет, то поменять объект методами Remove/Add. Есть вариант пытаться приводить коллекцию к IList<T>, и если она приводится, то менять объекты по индексу.
Но насколько это общий подход к решению проблемы?
Есть ли какой-нибудь наследник от ICollection<T>, который не являет наследников от IList<T>, но при этом поддерживает доступ по индексу?
Как решить эту задачу в общем виде, чтобы если коллекция поддерживает доступ по индексу, использовать его? (Как решить задачу с рефшлекшеном знаю, но этот вариант мне не очень нравится).
Здравствуйте, Аноним, Вы писали:
А> Задача в том, что есть коллекция и нужно в ней поменять объекты. Коллекция может быть любой (наследник от 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
Здравствуйте, _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<>.
Здравствуйте, Аноним, Вы писали:
А> Спасибо. Как раз про этот вариант я писал в своем сообщении. Я просто нее был уверен, что все коллекции объектов (именно одиночных объектов, а не словарь) поддерживают IList<>.
Что касается стандартных коллекций, то они могут не поддерживать IList<>, а поддерживать IList. Что касается
оверквотинга, то тут ты не прав