Skip to content

Instantly share code, notes, and snippets.

@Buildstarted
Created October 12, 2011 23:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Buildstarted/1282930 to your computer and use it in GitHub Desktop.
Save Buildstarted/1282930 to your computer and use it in GitHub Desktop.
Creating an IEnumerable<int> from a string
//Thanks to BLUEPIXY for adding -number handling and overall a better implementation
[TestFixture]
public class IEnumerableRangeTest {
static public IEnumerable<int> GetRange(int start, int end){
int step = (start > end)? -1:1;
for (int i = start; true ; i += step){
yield return i;
if(i == end) break;
}
}
static public IEnumerable<int> GetRange(string numbers) {
var items = numbers.Split(',');
var rangeRegex = new Regex(@"(-?\d+)-(-?\d+)");
foreach(var item in items) {
if(!string.IsNullOrWhiteSpace(item)) {
int result;
if(int.TryParse(item, out result)) {
yield return result;
continue;
} else if(rangeRegex.IsMatch(item)) {
var m = rangeRegex.Match(item);
foreach (var n in GetRange(int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value))){
yield return n;
}
continue;
}
throw new InvalidCastException(string.Format("Unable to cast \"{0}\" to an int", item));
}
}
}
[Test]
public void range_of_comma_separated_values_results_in_ten_elements() {
string range = "0,1,2,3,4,5,6,7,8,9";
var result = GetRange(range).ToList();
Assert.AreEqual(0, result.First());
Assert.AreEqual(9, result.Last());
Assert.AreEqual(10, result.Count());
}
[Test]
public void range_of_mixed_values_results_in_20_elements() {
string range = "0,1,2,3,4,5,6,7,8,9,10-19";
var result = GetRange(range).ToList();
Assert.AreEqual(0, result.First());
Assert.AreEqual(19, result.Last());
Assert.AreEqual(20, result.Count());
}
[Test]
public void range_of_1_to_9_contains_9_elements() {
string ranges = "1-9";
var result = GetRange(ranges).ToList();
Assert.AreEqual(1, result.First());
Assert.AreEqual(9, result.Last());
Assert.AreEqual(9, result.Count());
}
[Test]
public void individual_number_contains_one_element() {
string number = "1";
var result = GetRange(number).ToList();
Assert.AreEqual(1, result.First());
Assert.AreEqual(1, result.Count());
}
[Test, ExpectedException(typeof(InvalidCastException))]
public void invalid_number_throws_InvalidCastException() {
string range_with_invalid_number = "invalid";
GetRange(range_with_invalid_number).ToList();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment