Не зная много о ключе, я предлагаю простое решение:
Создайте класс для представления значения, а также времени его добавления и реализует интерфейс IComparable<T>
:
public class TimeStampedDouble : IComparable<TimeStampedDouble>
{
public TimeStampedDouble(double value)
{
Value = value;
Date = DateTime.Now;
}
public double Value { get; private set; }
public DateTime Date { get; private set; }
public int CompareTo(TimeStampedDouble other)
{
return this.Date.CompareTo(other.Date);
}
// User-defined conversion to double, for convenience
public static implicit operator double(TimeStampedDouble d)
{
return d.Value;
}
}
Измените список для хранения этого типа:
SortedList<int, TimeStampedDouble> list = new SortedList<int, TimeStampedDouble>();
Добавить элементы в список, используя новый класс:
//In this line, 1 is the key, 6 is the double you are storing.
myList.Add(1, new TimeStampedDouble(6));
myList.Add(3, new TimeStampedDouble(5));
myList.Add(2, new TimeStampedDouble(4));
myList.Add(7, new TimeStampedDouble(3));
myList.Add(5, new TimeStampedDouble(2));
Теперь вы можете получить самый старый предмет, используя Linq, и удалить его:
if (myList.Count() > mylistCount)
{
var oldest = myList.OrderByDescending(i => i.Value).FirstOrDefault();
myList.Remove(oldest.Key);
}
Элемент с ключом 5
удален.
Нет необходимости проверять, является ли oldest
null
, потому что a) это тип значения и b) проверка выполняется для минимального количества элементов, поэтому предполагается, что в списке всегда будет хотя бы один пункт, если mylistCount
больше 0
.
Поскольку предоставляется неявное преобразование в double
, вы можете использовать значение без явного приведения:
double doubleValue = myList[7];