A 'Between' extension method for Linq in C#.

Here's an example of a simple Linq extension method for getting values that fall within a certain range from an IEnumerable collection. First, we order the TSource items using the given selector. Then we use Invoke on each item in the collection to determine if the selector's result is above the lowest value we want. If it isn't, we skip it with the SkipWhile method. Once we're at a point where we know the selector's result is at least as large as the lowest value we want, we start taking items with the TakeWhile method until the same Invoke returns a value larger than the largest item we want. Then we just stop and return. It's a one-liner.

/// <summary>
/// Returns the values in a sequence whose resulting value of the specified 
/// selector is between the lowest and highest values given in the parameters.
/// </summary>
/// <typeparam name="TSource">
/// The type of elements in the sequence.
/// </typeparam>
/// <param name="source">
/// The IEnumerable object on which this method works.
/// </param>
/// <param name="selector">
/// The selector predicate used to attain the value.
/// </param>
/// <param name="lowest">
/// The lowest value of the selector that will appear in the new list.
/// </param>
/// <param name="highest">
/// The hightest value of the selector that will appear in the new list.
/// </param>
/// <returns>
/// An IEnumerable sequence of TSource whose selector values fall within the range 
/// of <paramref name="lowest"/> and <paramref name="highest"/>.
/// </returns>
public static IEnumerable<TSource> Between<TSource, TResult>
(
    this IEnumerable<TSource> source, Func<TSource, TResult> selector,
    TResult lowest, TResult highest
)
    where TResult : IComparable<TResult>
{
    return source.OrderBy(selector).
        SkipWhile(s => selector.Invoke(s).CompareTo(lowest) < 0).
        TakeWhile(s => selector.Invoke(s).CompareTo(highest) <= 0 );
}
 
/// <summary>
/// This is a simple test for the Between Linq extension method. We'll add a few
/// values to a list and select only those that are between a certain range.
/// When we're done, we should know the lowest and highest values contained
/// in the resulting values set.
/// </summary>
[TestMethod]
public void BetweenTest()
{
    var list = new List<double>();
    for (var i = 1; i <= 20; i++)
        list.Add(i);
    var fiveTo15 = list.Between(s => s, 5, 15);
    Assert.IsTrue(fiveTo15.Min() == 5);
    Assert.IsTrue(fiveTo15.Max() == 15);
}
Tags:

1 comment for 'A 'Between' extension method for Linq in C#.'

1. And a quick SQL Server

And a quick SQL Server example:

SELECT *
FROM Persons
WHERE PersonId BETWEEN 40 and 45

Which will give you all persons with an ID between 40 and 45, inclusive.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.
  • Image links with 'rel="lightbox"' in the <a> tag will appear in a Lightbox when clicked on.

More information about formatting options

CAPTCHA
Please verify your species.