Нужна коллекция, которая потокобезопасно и по порядку сможет отдавать свои элементы при запросе без их удаления, при достижении конца коллекции, начать отдачу сначала. При этом всём, должна быть возможность добавления новых элементов прямо во время работы с этой коллекцией. Я сразу обратил внимание на интерфейс IEnumerator. Для потокобезопасности, я выбрал concurrentbag, т.к в документации написано, что работа с enumerator там реализована потокобезопасно. Вопрос в том, что не получается сделать конечный удобный интерфейс для работы с такой коллекцией.
public class InfoBag : ConcurrentBag<string>
{
public IEnumerator<string> Enumerator { get; private set; }
public InfoBag()
{
Enumerator = GetEnumerator();
}
public void AddRange(IEnumerable<string> items)
{
foreach (var item in items)
{
base.Add(item);
}
Enumerator = GetEnumerator();
}
public new void Add(string item)
{
base.Add(item);
Enumerator = GetEnumerator();
}
public string Take()
{
if (!Enumerator.MoveNext())
{
Enumerator = GetEnumerator();
Enumerator.MoveNext();
}
return Enumerator.Current;
}
}
В этом примере много неудобств, например если нету элементов, коллекция всегда будет возвращать null. И вообще у меня ощущения что я сделал кривой велосипед, есть ли другие пути решения данной задачи или мой пример это норма и такое можно использовать?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости