If possible, I would save the instances in the array, sorted by StartTime, and then call BinarySearch to determine the indices in the array whose boundaries end in.
Then, with this in mind, you can easily quickly access a subset based on a date range.
I developed a general class that can also help you with this:
public class BinarySearcher<T>
{
private class ComparisonComparer : Comparer<T>
{
Comparison<T> comparison;
internal static IComparer<T> Create(Comparison<T> comparison)
{
if (comparison == null)
{
return Comparer<T>.Default;
}
return new ComparisonComparer(comparison);
}
private ComparisonComparer(Comparison<T> comparison)
{
this.comparison = comparison;
}
public override int Compare(T x, T y)
{
return comparison(x, y);
}
}
T[] elements;
IComparer<T> comparer;
public BinarySearcher(IEnumerable<T> elements) :
this(elements, false, (IComparer<T>) null) { }
public BinarySearcher(IEnumerable<T> elements, bool sorted) :
this(elements, sorted, (IComparer<T>) null) { }
public BinarySearcher(IEnumerable<T> elements,
Comparison<T> comparer) :
this(elements, false,
ComparisonComparer.Create(comparer)) { }
public BinarySearcher(IEnumerable<T> elements, bool sorted,
Comparison<T> comparer) :
this(elements, sorted,
ComparisonComparer.Create(comparer)) { }
public BinarySearcher(IEnumerable<T> elements,
IComparer<T> comparer) :
this(elements, false, comparer) { }
public BinarySearcher(IEnumerable<T> elements, bool sorted,
IComparer<T> comparer) :
this(elements.ToArray(), sorted, comparer) { }
public BinarySearcher(T[] elements) : this(elements, false) { }
public BinarySearcher(T[] elements, bool sorted) :
this(elements, sorted, (IComparer<T>) null) { }
public BinarySearcher(T[] elements, Comparison<T> comparer) :
this(elements, false, ComparisonComparer.Create(comparer)) { }
public BinarySearcher(T[] elements, bool sorted,
Comparison<T> comparer) :
this(elements, sorted, ComparisonComparer.Create(comparer)) { }
public BinarySearcher(T[] elements, IComparer<T> comparer) :
this(elements, false, comparer) { }
public BinarySearcher(T[] elements, bool sorted,
IComparer<T> comparer)
{
if (comparer == null)
{
comparer = Comparer<T>.Default;
}
this.comparer = comparer;
if (!sorted)
{
Array.Sort(elements, this.comparer);
}
this.elements = elements;
}
public IEnumerable<T> Between(T from, T to)
{
int index = Array.BinarySearch(this.elements, from, comparer);
bool found = (index >= 0);
if (!found)
{
index = ~index;
}
if (found)
{
for (; index >= 0 &&
comparer.Compare(from, elements[index]) == 0;
--index) ;
index++;
}
for ( ; index < elements.Length; index++)
{
if (comparer.Compare(elements[index], to) <= 0)
{
yield return elements[index];
}
else
{
yield break;
}
}
}
}
, (IComparer<T> Comparable<T>). , , // ( ).
. , BinarySearch Array, IComparer, ( , ).
, , , , .
, , .
, :
public class Task
{
public string Name;
public DateTime StartTime;
}
:
Task[] tasks =
{
new Task() { Name = "Task 1", StartTime = new DateTime(2009, 02, 18) },
new Task() { Name = "Task 2", StartTime = new DateTime(2009, 02, 16) },
new Task() { Name = "Task 3", StartTime = new DateTime(2009, 02, 12) },
new Task() { Name = "Task 4", StartTime = new DateTime(2009, 02, 11) },
new Task() { Name = "Task 5", StartTime = new DateTime(2009, 02, 10) },
new Task() { Name = "Task 6", StartTime = new DateTime(2009, 02, 01) },
new Task() { Name = "Task 7", StartTime = new DateTime(2009, 02, 09) }
};
BinarySearcher<Task> searcher = new BinarySearcher<Task>(tasks,
(x, y) => Comparer<DateTime>.Default.Compare(x.StartTime, y.StartTime));
foreach (Task t in searcher.Between(
new Task() { StartTime = new DateTime(2009, 02, 13) },
new Task() { StartTime = new DateTime(2009, 02, 10) }))
{
Console.WriteLine(t);
}