2013-03-07 2 views
1

У меня есть упорядоченная коллекция значений DateTime. Я хочу получить все значения в коллекции между конкретным временем начала и окончания. Какую коллекцию я должен использовать, чтобы сделать это наиболее эффективным образом и как?Получить ассортимент в заказе коллекции

ответ

1

Вы можете использовать List<T>, но храните его под заказ. Используйте метод BinarySearch, чтобы найти начало DateTime в списке. Обратите внимание, что он возвращает:

Нулевой индекс элемента в отсортированном списке, если элемент найден; в противном случае - отрицательное число, которое является поразрядным дополнением к индексу следующего элемента, который больше элемента или, если нет более крупного элемента, поразрядное дополнение к Count.

Поэтому, если значение отрицательное, вам необходимо применить побитовое дополнение (оператор ~), чтобы найти первый индекс, находящийся в пределах диапазона. Затем вы можете использовать один и тот же процесс и вычесть 1, чтобы найти последний элемент в пределах диапазона.

0

Использование LINQ (как это один из тегов), вы можете сделать это следующим образом:

IEnumerable<DateTime> orderedDateTimes; // Your ordered DateTime collection 
DateTime start;  // The start date/time, inclusive 
DateTime end;  // The end date/time, inclusive 

var range = orderedDateTimes 
      .SkipWhile(dt => dt < start) 
      .TakeWhile(dt => dt <= end); 

Это займет O (N) худший случай, чтобы получить диапазон. Тем не менее, вы можете принудительно привести результат в список или массив, чтобы иметь возможность его эффективно использовать:

DateTime[] rangeArray = range.ToArray(); 
// -or- 
List<DateTime> rangeList = range.ToList(); 
+2

Это не принесет никакой пользы, эта коллекция уже отсортирована. Я не думаю, что LINQ является хорошим выбором для этой проблемы. – MarcinJuraszek

+0

@MarcinJuraszek: Если коллекция не была отсортирована, мой код не сработает. Поэтому он использует это. Однако, в максимально возможной степени (двоичный поиск и т. Д.). Но он добавил тег LINQ, поэтому я ответил. – Virtlink

Смежные вопросы