The best option would be to remove the spaces from the card number on input so you only have to perform the cleaning operation once:
public class CreditCard: IComparable<CreditCard>
{
string creditCardNumberClean;
string creditCardNumberOriginal;
public string CreditCardNumber
{
get
{
return this.creditCardNumberOriginal;
}
set
{
this.creditCardNumberOriginal = value;
this.creditCardNumberClean = value.Replace(" ", "");
}
}
public CreditCard(string creditCardNumber)
{
this.CreditCardNumber = creditCardNumber;
}
public int CompareTo(CreditCard other)
{
return this.creditCardNumberClean.CompareTo(other.creditCardNumberClean);
}
}
But if that's not possible you basically want to perform a string comparison on the card number just mutating the number to remove all spaces before the comparison:
class Program
{
public static void Main(string[] args)
{
List<string> list = new List<string>(new string[]{"1234 1234 1234 1234", "1234123412341234","9999 9999 9999 9999"});
SortedSet<string> set = new SortedSet<string>(list, new CreditCardNoComparer());
foreach (string s in set)
{
Console.WriteLine(s);
}
Console.ReadKey();
}
}
public class CreditCardNoComparer : IComparer<string>
{
public int Compare(string x, string y)
{
return x.Replace(" ", "").CompareTo(y.Replace(" ", ""));
}
}
EDIT
//version using overridden GetHashCode and Equals methods as per @lazyberezovsky's comments
public class CreditCard
{
long creditCardNumberClean; //given the card number is numeric this is the most efficient way of storing it
string creditCardNumberOriginal;
public string CreditCardNumber
{
get
{
return this.creditCardNumberOriginal;
}
set
{
this.creditCardNumberOriginal = value;
this.creditCardNumberClean = long.Parse(value.Replace(" ", ""));
}
}
public CreditCard(string creditCardNumber)
{
this.CreditCardNumber = creditCardNumber;
}
public override bool Equals(object obj)
{
CreditCard other = obj as CreditCard;
return
other == null
? false
: this.creditCardNumberClean.Equals(other.creditCardNumberClean);
}
public override int GetHashCode()
{
return this.creditCardNumberClean.GetHashCode();
}
}