I am parsing the following line of code via a specific format.Line is:S|111111|87654321|Bar UK|BCreace UK|GBP|24/08/2010|The Format is:Index    Field Length    S0 -     1               S1 -     6S2 -     34.......S6 -     10I am validating using many if statements. Could anyone suggest a better approach?private static StatementLineResult Validate(string delimitedRecord){    if (delimitedRecord == null)        throw new ArgumentNullException(delimitedRecord);    var items = delimitedRecord.Split('|');    if(items.Length != 19)        throw new Exception(Improper line format);    var errorMessage = new Dictionary<string, string>();    var bankIdentifierCodes = new List<string> {ABCDGB2L, EFGHGB2L};    if (items[0].Length != 1 || items[0] != S)        errorMessage.Add(Record Identifier,Invalid Record Identifier);    var sortCode = 0;    if (!int.TryParse(items[1], out sortCode) || items[1].Length > 6)        errorMessage.Add(Sort Code, Invalid sort code);    if (string.IsNullOrEmpty(items[2]) || items[1].Length > 34)        errorMessage.Add(Account Number, Invalid account number);    if (string.IsNullOrEmpty(items[3]) || items[1].Length > 35)        errorMessage.Add(Account Alias, Invalid account alias);    if (string.IsNullOrEmpty(items[4]) || items[1].Length > 35)        errorMessage.Add(Account Name, Invalid account name);    if(string.IsNullOrEmpty(items[5]) || items[5].Length != 3)        errorMessage.Add(Account Currency, Invalid account currency);    if (!string.IsNullOrEmpty(items[6]) && items[6].Length > 20)        errorMessage.Add(Account Type, Invalid account type);    if(string.IsNullOrEmpty(items[7]) || items[7].Length != 8 || !bankIdentifierCodes.Contains(items[7],StringComparer.OrdinalIgnoreCase))        errorMessage.Add(Bank Identifier Code, Invalid bank identifier code);    if (!string.IsNullOrEmpty(items[8]) && items[8].Length > 35)        errorMessage.Add(Bank Name, Invalid bank name);    if (!string.IsNullOrEmpty(items[9]) && items[9].Length > 27)        errorMessage.Add(Bank Branch Name, Invalid bank branch name);    DateTime transactionDate;    if (!DateTime.TryParse(items[10], out transactionDate))        errorMessage.Add(Transaction Date, Invalid date);    if (!string.IsNullOrEmpty(items[11]) && items[11].Length > 25)        errorMessage.Add(Narrative Line 1, Invalid narrative line 1);    if (!string.IsNullOrEmpty(items[12]) && items[12].Length > 25)        errorMessage.Add(Narrative Line 2, Invalid narrative line 2);    if (!string.IsNullOrEmpty(items[13]) && items[13].Length > 25)        errorMessage.Add(Narrative Line 13, Invalid narrative line 13);    if (!string.IsNullOrEmpty(items[14]) && items[14].Length > 25)        errorMessage.Add(Narrative Line 14, Invalid narrative line 14);    if (!string.IsNullOrEmpty(items[15]) && items[15].Length > 25)        errorMessage.Add(Narrative Line 15, Invalid narrative line 15);    if(_transactionTypes.First(item=>item.TransactionType==items[16]) == null)        errorMessage.Add(Transaction Type, Invalid transaction type);    decimal debitValue;    if(items[17] !=  && !Decimal.TryParse(items[17], out debitValue))        errorMessage.Add(Debit Value, Invalid debit amount);    decimal creditValue;    if (items[18] !=  && !Decimal.TryParse(items[18], out creditValue))        errorMessage.Add(Credit Value, Invalid credit amount);    return new StatementLineResult()    {        ErrorMessages = errorMessage,        Data = BankLineData(delimitedRecord),        IsValid = errorMessage.Count==0    };}
Parsing pipe delimited lines
c#;parsing;asp.net;csv
You are using the following if quite a lot:if (string.IsNullOrEmpty(items[index]) || items[index].Length > value)    errorMessage.Add(Field Name, Invalid field value);now, there is not much you can do about this, but I do notice that you are making some mistakes in copy-pasting the index values, which could be avoided by making the conditional statement into a separate method:private boolean FieldHasCorrectLength(string field, int length){    return string.IsNullOrEmpty(field) || field.Length > value;}And then call it like this:if (FieldHasCorrectLength(items[index], value))    errorMessage.Add(Field Name, Invalid field value);You can then combine this with the recommendation from t3chb0t to add an Attribute annotation to the class you're parsing the line to. Another advantage of this is that it's easier to add a secondary validation check, because adding extra validations doesn't mean struggling with whether you need to use || or &&, which can get confusing in your case because you sometimes use && and sometime || for what is essentially the same comparison.