1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| public class SerialNumberRing { private readonly List<string> carryRing = new List<string> { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", };
public readonly List<string> CarryRing16 = new List<string> { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", };
public SerialNumberRing() { carryRing = CarryRing16; } public SerialNumberRing(List<string> carryRing) { this.carryRing = carryRing; }
private string GetNextCarry(string num) { var index = carryRing.IndexOf(num); if(index == carryRing.Count - 1) return carryRing[0];
var carry = carryRing[index + 1]; return carry; }
public string GetNext(string numbers) { var currentNumberArray = numbers.ToCharArray().Select(c => c.ToString()).ToArray(); return GetNext(currentNumberArray); }
public string GetNext(string[] numbers) { int current = numbers.Length - 1; while (current >= 0) { if(numbers[current] == carryRing[ carryRing.Count - 1]) { numbers[current] = carryRing[0]; } else { var num = numbers[current]; var carry = GetNextCarry(num); numbers[current] = carry; break; } current--; } string result = BuildResult(numbers); return result; }
private string BuildResult(string[] numbers) { string result = ""; foreach (var item in numbers) result += item.ToString(); return result; } }
[TestClass()] public class UnitTestSerialNumberRingUseLoop { [DataRow("00000", "00001")] [DataRow("00009", "0000A")] [DataRow("0000A", "0000B")] [DataRow("0000F", "00010")] [DataRow("FFF", "000")] [DataRow("FFE", "FFF")] [DataRow("FF9", "FFA")] [TestMethod()] public void CarryNumAreEqual( string currentNumber, string expected) { var generator = new SerialNumberRing(); string serialNumber = generator.GetNext(currentNumber); Assert.AreEqual(expected, serialNumber); } }
|