public class CardValidator { private const int Divisor = 11; private const int MinLen = 17; private static readonly List<int> Factors=new List<int>() { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 }; private static readonly Dictionary<int,string> Result=new Dictionary<int, string>() { {0,"1"},{1,"0"},{2,"X"},{3,"9"},{4,"9"},{5,"7"},{6,"6"},{7,"5"},{8,"4"},{9,"3"},{10,"2"} }; private static readonly List<int> Products=new List<int>(); public static bool IsValid(string cardNo) { if (string.IsNullOrEmpty(cardNo) || cardNo.Length <MinLen) { return false; } var subCard = cardNo.Substring(0, MinLen); for (var i=0;i<subCard.Length;i++) { int c; if (!int.TryParse(subCard.Substring(i,1), out c)) { return false; } Products.Add(c*Factors[i]); } var sum = Products.Sum(); var mod = sum%Divisor; var val = Result[mod]; return val == cardNo.Substring(cardNo.Length - 1, 1); } }