Search Wiki:
Description
A very simple Scanner class configured using a fluent interface.

For more like this, see Samuel Jack's blog, Functional Fun.


Example Usage
    public class RangeCompacter
    {
        public IEnumerable<Range> Compact(IEnumerable<int> numbers)
        {
            var scanner = new Scanner<int, Range>();
 
            scanner.ConfigurePattern()
                .StartMatchingWhenAny()
                .ContinueMatchingWhile((nextItem, matchedItems) => nextItem == matchedItems.Last() + 1)
                .Output(details => new Range(
                                            details.MatchedItems.First(),
                                            details.MatchedItems.Last()));
 
            var preparedList = numbers.Distinct().OrderBy(x => x);
 
            return scanner.Scan(preparedList);
        }
    }
 
    public struct Range
    {
        public int First { get; private set; }
        public int Last { get; private set; }
 
        public Range(int first, int last) : this()
        {
            First = first;
            Last = last;
        }
 
        public override string ToString()
        {
            return (First == Last) ? First.ToString() : First + " - " + Last;
        }
    }
 
    class RangeCompacterTests
    {
        [Test]
        public void Usage_sample()
        {
            var numbers = new[] {1, 3, 4, 5, 9, 11, 12, 13};
 
            var compacter = new RangeCompacter();
            var ranges = compacter.Compact(numbers);
 
            // create a pretty string, each range or number separated by a comma
            var display = string.Join(
                ", ", 
                ranges
                .Select(range => range.ToString())
                .ToArray());
 
            Assert.AreEqual("1, 3 - 5, 9, 11 - 13", display);
        }
    }
Last edited Apr 29 2009 at 9:19 PM  by samuel_d_jack, version 3
Updating...
Page view tracker