Коллекция с поддержкой хранения в отсотированном виде

Попытаюсь сформулировать задачу:

Мне прилетают сообщения с временно меткой, которые я должен сохранять в коллекцию.

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

Нашел SortedList, но как я понял, он не поддерживает одинаковые ключи, а хоть и ситуация маловероятна, но дублирующий ключ по времени возможен.

Есть ли чего-то из коробки для решения моей задачи?

Самое просто- это заполнять простой List, а потом пересортировывать и подчищать, но сортировать на каждый чих имхо ресурсоемко...


Ответы (2 шт):

Автор решения: user11354240

Можно в коллекции хранить не сами сообщения, а списки сообщений по ключу метки времени:

internal class Program
{
  static void Main(string[] args)
  {
    var p = new Program();
    p.AddMessage(0, "A");
    p.AddMessage(1, "A");
    p.AddMessage(1, "B");
    foreach(var kvp in p._messages)
    foreach(var txt in kvp.Value)
      Console.WriteLine("{0} {1}", kvp.Key, txt);
  }

  readonly SortedList<int, List<string>> _messages = new SortedList<int, List<string>>();
  void AddMessage(int timestamp, string text)
  {
    if (_messages.TryGetValue(timestamp, out var l))
      l.Add(text);
    else
      _messages.Add(timestamp, new List<string>{text});
  }
}

только учтите написанное здесь: https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.sorteddictionary-2?redirectedfrom=MSDN&view=net-7.0

The SortedDictionary<TKey,TValue> generic class is a binary search tree with O(log n) retrieval, where n is the number of elements in the dictionary. In this respect, it is similar to the SortedList<TKey,TValue> generic class. The two classes have similar object models, and both have O(log n) retrieval. Where the two classes differ is in memory use and speed of insertion and removal:

  • SortedList<TKey,TValue> uses less memory than SortedDictionary<TKey,TValue>.
  • SortedDictionary<TKey,TValue> has faster insertion and removal operations for unsorted data: O(log n) as opposed to O(n) for
    SortedList<TKey,TValue>.
  • If the list is populated all at once from sorted data, SortedList<TKey,TValue> is faster than SortedDictionary<TKey,TValue>.

Возможно, SortedDitionary будет более оптимальным решением.

→ Ссылка
Автор решения: MBo
PriorityQueue<TElement,TPriority>

(возможно, вариант с компаратором для дат)

Добавляете Enqueue
При удалении старых делаете Peek и Dequeue

→ Ссылка