public static bool validateImeiLong(string imei) { if (!imeiRx.IsMatch(imei)) { return false; } var numbers = imei.ToCharArray().Select(x => int.Parse(x.ToString())).ToArray(); var doubles = Enumerable.Range(0, 15).Select(x => x % 2 == 0 ? numbers[x] : 2 * numbers[x]).ToArray(); var doublesDigits = doubles.Select(x => x >= 10 ? x - 9 : x).ToArray(); // x - 10 (mod 10) + 1 (first digit) var sum = doublesDigits.Sum(); var mod10 = sum % 10; bool isValid = false; if (mod10 == 0) isValid = true; return isValid; } private static Regex imeiRx = new Regex(@"^\d{15}$", RegexOptions.Singleline | RegexOptions.Compiled); public static bool IsValidImei(string imei) { if (!imeiRx.IsMatch(imei)) { return false; } bool isValid = false; var digits = imei.ToCharArray().Select(x => int.Parse(x.ToString())).ToArray(); var sum = Enumerable.Range(0, 15).Select(x => x % 2 == 0 ? digits[x] : 2 * digits[x]).Select(x => x >= 10 ? x - 9 : x).Sum(); if (sum % 10 == 0) isValid = true; return isValid; }