Created
October 12, 2011 23:18
-
-
Save Buildstarted/1282930 to your computer and use it in GitHub Desktop.
Creating an IEnumerable<int> from a string
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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