Замена элемента в ICollection

#c# #.net #string #collections

#c# #.net #Коллекции #icollection

Вопрос:

Предположим, у меня есть ICollection<SomeClass> .

У меня есть следующие две переменные:

 SomeClass old;
SomeClass new;
 

Как я могу добиться чего-то подобного следующему, используя an ICollection<SomeClass> ?

 // old is guaranteed to be inside collection
collection.Replace(old, new);
 

Комментарии:

1. Какую реализацию ICollection<T> вы используете?

2. @Valentin Я говорю о том, чтобы сделать это с помощью ICollection интерфейса

3. Это зависит от того, какой тип реализует этот интерфейс.

4. @stuartd Это должно иметь значение? Я использую HashSet<SomeClass>

Ответ №1:

Здесь нет черной магии: ICollection<T> не упорядочен и предоставляет только Add / Remove методы. Вашим единственным решением было бы проверить, является ли фактическая реализация чем-то большим, например IList<T> :

 public static void Swap<T>(this ICollection<T> collection, T oldValue, T newValue)
{
    // In case the collection is ordered, we'll be able to preserve the order
    var collectionAsList = collection as IList<T>;
    if (collectionAsList != null)
    {
        var oldIndex = collectionAsList.IndexOf(oldValue);
        collectionAsList.RemoveAt(oldIndex);
        collectionAsList.Insert(oldIndex, newValue);
    }
    else
    {
        // No luck, so just remove then add
        collection.Remove(oldValue);
        collection.Add(newValue);
    }

}
 

Комментарии:

1. это действительно помогло мне удалить элементы из коллекции с помощью index

Ответ №2:

ICollection<T> Интерфейс довольно ограничен, вам придется использовать Remove() и Add()

 collection.Remove(old);
collection.Add(new);
 

Комментарии:

1. Я думал об этом, но new будет добавлен в конец коллекции, а old не в местоположение

2. Да, вот почему я удалил свой комментарий. Но было бы точнее сказать ICollection , что не гарантируется наличие заказа. Для этого вы должны использовать что-то более конкретное, общее для всех используемых вами типов коллекций, которые фактически поддерживают порядок. Возможно IList<T> , вместо этого?

3. @MatiasCicero, даже если он имеет некоторый порядок, это всего лишь детали реализации, и вам не следует ссылаться на него при разработке своих классов.

4. @MatiasCicero Если вам нужна упорядоченная коллекция, вы должны использовать IList<T>

5. @MatiasCicero Вы упомянули, что используете HashSet<T> в качестве ICollection<T> реализации. Наборы по определению неупорядочены. Из документа MSDN HashSet: «Набор — это коллекция, которая не содержит повторяющихся элементов и элементы которой не расположены в определенном порядке».

Ответ №3:

Сделайте это:

     yourCollection.ToList()[index] = newValue;
 

Комментарии:

1. Хотя этот ответ может помочь OP, подумайте о том, чтобы улучшить свой ответ, указав шаги, предпринятые для решения проблемы