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