У меня есть группа флажков, которые я хочу разрешить проверять только определенную сумму в любое время. Если вновь установленный флажок превысит лимит, я бы хотел, чтобы самый старый флажок был автоматически снят. Все группы флажков используют один и тот же обработчик событий, показанный ниже.
Я достиг функциональности с помощью очереди, но это довольно грязно, когда мне нужно удалить элемент из середины очереди, и я думаю, что есть более элегантный способ. Особенно мне не нравится преобразовывать очередь в список, просто чтобы вызвать один метод перед тем, как преобразовать список обратно в очередь.
- Есть ли лучший способ сделать это?
- Это хорошая идея отсоединить обработчики событий, как я.
Вот код.
private Queue<CheckBox> favAttributesLimiter - new Queue<CheckBox>();
private const int MaxFavoredAttributes = 5;
private void favoredAttributes_CheckedChanged(object sender, EventArgs e)
{
CheckBox cb = (CheckBox)sender;
if (cb.Checked)
{
if (favAttributesLimiter.Count == MaxFavoredAttributes)
{
CheckBox oldest = favAttributesLimiter.Dequeue();
oldest.CheckedChanged -= favoredAttributes_CheckedChanged;
oldest.Checked = false;
oldest.CheckedChanged += new EventHandler(favoredAttributes_CheckedChanged);
}
favAttributesLimiter.Enqueue(cb);
}
else // cb.Checked == false
{
if (favAttributesLimiter.Contains(cb))
{
var list = favAttributesLimiter.ToList();
list.Remove(cb);
favAttributesLimiter=new Queue<CheckBox>(list);
}
}
}
Редактировать:
Чакрит ответил на мой настоящий вопрос с лучшей заменой Очереди (Of T). Тем не менее, аргумент, что моя идея снять флажки на самом деле была плохой, был довольно убедительным. Я оставляю ответ Чакрита как принятый, но я проголосовал за другие ответы, потому что они предлагают более последовательное и полезное решение в глазах пользователя.