DescriptionA 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);
}
}
|