После почти двух недель не думая о проблеме, я нашел решение. Просто нужно условие, когда устанавливать Позицию (поэтому я изменил закомментированную строку на эти):
if (mediaPlayer.Position > TimeSpan.FromSeconds(value + 1) || mediaPlayer.Position < TimeSpan.FromSeconds(value - 1))
mediaPlayer.Position = TimeSpan.FromSeconds(value);
Хотя требуется хотя бы 1 секунда изменения, таким образом, программа игнорирует откаты в миллисекундах, что вызывает заикание, пока ползунок все еще перетаскивается.
Двоичный поиск SortedList.Keys
набор.
Здесь мы идем. Это - O (журнал n):
private static int BinarySearch<T>(IList<T> list, T value)
{
if (list == null)
throw new ArgumentNullException("list");
var comp = Comparer<T>.Default;
int lo = 0, hi = list.Count - 1;
while (lo < hi) {
int m = (hi + lo) / 2; // this might overflow; be careful.
if (comp.Compare(list[m], value) < 0) lo = m + 1;
else hi = m - 1;
}
if (comp.Compare(list[lo], value) < 0) lo++;
return lo;
}
public static int FindFirstIndexGreaterThanOrEqualTo<T,U>
(this SortedList<T,U> sortedList, T key)
{
return BinarySearch(sortedList.Keys, key);
}
Я пошел бы с LINQ (предположение, что Вы используете C#3), но используете перегрузку FirstOrDefault, который берет предикат:
first = sortedList.FirstOrDefault(x => x >= theObjectForComparison);
(много других Счетных методов может также взять предикаты, который является хорошим ярлыком)
Не знающий один, но это - простой оператор LINQ:
first = sortedList.Where(x => x >= theObjectForComparison).FirstOrDefault();
first
или будет первый объект, который передает сравнение или default(T)
(который обычно является null
).
Редактирование
версия DaveW:
first = sortedList.FirstOrDefault(x => x >= theObjectForComparison);
делает то же задание, но мог потенциально быть быстрее, необходимо будет протестировать его все же.
Или можно записать собственный дополнительный метод, чтобы сделать это. Обратите внимание, что все те функции, КАК гарантируют, не войдут в sequesce.