تشخیص اصالت شناسه ملی در C#

صحت اعتبار شناسه ملی دارای الگوریتمی است که با کمی جستجو پیدا میشه.

نمونه کد زیر این کار رو در C# انجام میده:


public static bool IsValidCompanyCode(string companyCode)
{

    var trimmedCompanyCode = companyCode != null ? companyCode.Trim() : null;

    //remark: در صورتی که شناسه ملی وارد شده تهی باشد
    if (string.IsNullOrEmpty(trimmedCompanyCode))
        return false;

    long tempCompanyCode;
    byte c, c10;
    int r, n;
    //remark: در صورتی که طول شناسه ملی وارد شده
    //      مخالف 10 رقم
    //      یا غیر عددی
    //      یا رشته های خاص
    //      باشد
    if (trimmedCompanyCode.Length != 11
        || !long.TryParse(trimmedCompanyCode, out tempCompanyCode)
        || trimmedCompanyCode.Contains("-")
        || trimmedCompanyCode.Contains("+")
        || new string[] { "00000000000", "11111111111", "22222222222", "33333333333", "44444444444",
                          "55555555555", "66666666666", "77777777777", "88888888888", "99999999999"
                        }
            .Contains(trimmedCompanyCode))
        return false;
    byte.TryParse(trimmedCompanyCode.Substring(10, 1), out c);
    byte.TryParse(trimmedCompanyCode.Substring(9, 1), out c10);

    n = new int[] {
                    (byte.Parse(trimmedCompanyCode.Substring(0, 1)) + c10 + 2) * 29,
                    (byte.Parse(trimmedCompanyCode.Substring(1, 1)) + c10 + 2) * 27,
                    (byte.Parse(trimmedCompanyCode.Substring(2, 1)) + c10 + 2) * 23,
                    (byte.Parse(trimmedCompanyCode.Substring(3, 1)) + c10 + 2) * 19,
                    (byte.Parse(trimmedCompanyCode.Substring(4, 1)) + c10 + 2) * 17,
                    (byte.Parse(trimmedCompanyCode.Substring(5, 1)) + c10 + 2) * 29,
                    (byte.Parse(trimmedCompanyCode.Substring(6, 1)) + c10 + 2) * 27,
                    (byte.Parse(trimmedCompanyCode.Substring(7, 1)) + c10 + 2) * 23,
                    (byte.Parse(trimmedCompanyCode.Substring(8, 1)) + c10 + 2) * 19,
                    (byte.Parse(trimmedCompanyCode.Substring(9, 1)) + c10 + 2) * 17
                   }
         .Sum();
    Math.DivRem(n, 11, out r);
    if (r == 10)
        r = 0;

    if (r == c)
        return true;

    return false;

}