Я хочу использовать HashSet, но беспокоюсь, что он «тихо» поглощает дубликаты (возвращая true/false), но не выдавая исключение. Меня интересует эквивалентная структура данных, которая выдает исключение (например, словарь).
Какой лучший подход для этого?
Вы можете просто определить метод расширения на HashSet<T>
(и доверять ему немного больше, чтобы не пришлось этого делать).
public static class Extensions {
public static void AddWithThrow<T>(this HashSet<T> hashSet, T value) {
if (hashSet.Add(value) == false) {
throw new ArgumentException("An item with the same value has already been added");
}
}
}
и если по какой-то причине у вас был приемный метод ICollection<T>
, который хочет добавить семантику Add
, возможно, это:
public class ThrowingHashSet<T> : HashSet<T>, ICollection<T> {
// uncomment if you can live with the confusion
// of HashSet<T> variables and HashSet<T> accepting methods
// calling the existing HashSet<T>.Add non-throwing method instead
// public new void Add(T value) => AddWithThrow(value);
private void AddWithThrow(T value) {
if (base.Add(value) == false) {
throw new ArgumentException("An item with the same value has already been added");
}
}
void ICollection<T>.Add(T item) => this.AddWithThrow(item);
}
Будьте осторожны: этот трюк не работает, если тип переменной — HashSet<T>
. Затем вызывается исходный (и до сих пор существующий) метод Add()
.
@Progman Я прямо сказал об этом при использовании ссылкиICollection<T>
... во втором предлагаемом решении...
все еще отредактировал ответ, который добавляет предупреждение.
Используйте
Dictionary
?