Уже есть проект, который, я считаю, делает именно это - i4o .Я не могу сказать, что использовал это сам, но это звучит так, как вы хотите ... вам, возможно, придется немного поработать над существующим кодом, но это, безусловно, стоит посмотреть.
Есличто не помогает, вы могли бы по крайней мере написать свои собственные методы расширения для SortedList<TKey, TValue>
.Возможно, вы не сможете легко использовать ваше фактическое предложение where
, но вы можете использовать свои собственные методы, принимающие минимальное и максимальное значения.Возможно, вы также захотите применить их к IList<T>
, где вы утверждаете , что вы уже отсортировали значения соответствующим образом (согласно некоторому компаратору).
Дляпример (полностью непроверенный):
public static IEnumerable<T> Between<T, TKey>(this IList<T> source,
Func<T, TKey> projection,
TKey minKeyInclusive,
TKey maxKeyExclusive,
IComparer<TKey> comparer)
{
comparer = comparer ?? Comparer<TKey>.Default;
// TODO: Find the index of the lower bound via a binary search :)
// (It's too late for me to jot it down tonight :)
int index = ...; // Find minimum index
while (index < source.Count &&
comparer.Compare(projection(source[index]), maxKeyExclusive) < 0)
{
yield return source[index];
index++;
}
}
(Если у вас есть List<T>
вместо IList<T>
, вы можете использовать List<T>.BinarySearch
, хотя вам нужно будет построитьcustom IComparer<T>
.)
Также обратите внимание на SortedSet<T>
в .NET 4.