Reputation: 255
My Problem: I have a list that I want to sort by sortname. That works very well. But i have sortnames with special chars at the begin. What can I do so that symbols are not observed?
Example of sortname with symbols: (alternative)Commerce Bank
my sortfunction:
cmembers.Sort(delegate (ChamberMembers x, ChamberMembers y)
{
if (x.companysortName == null && y.companysortName == null) return 0;
else if (x.companysortName == null) return -1;
else if (y.companysortName == null) return 1;
else return x.companysortName.CompareTo(y.companysortName);
});
The symbols may not be deleted!
Upvotes: 0
Views: 1998
Reputation: 62
If I understand your question, this is an example:
static void Main(string[] args)
{
List<ChamberMembers> lst = new List<ChamberMembers>();
lst.Add(new ChamberMembers
{
companysortName = "b"
});
lst.Add(new ChamberMembers
{
companysortName = "z"
});
lst.Add(new ChamberMembers
{
companysortName = "e"
});
lst.Add(new ChamberMembers
{
companysortName = "a"
});
Console.WriteLine("\nBefore sort:");
foreach (ChamberMembers ChamberMember in lst)
{
Console.WriteLine(ChamberMember.companysortName);
}
lst.Sort();
Console.WriteLine("\nAfter sort:");
foreach (ChamberMembers ChamberMember in lst)
{
Console.WriteLine(ChamberMember.companysortName);
}
Console.ReadLine();
}
}
public class ChamberMembers : IComparable<ChamberMembers>
{
public string companysortName { get; set; }
public int CompareTo(ChamberMembers Chamber)
{
if (Chamber == null)
return 1;
else
return string.Compare(this.companysortName, Chamber.companysortName, CultureInfo.InvariantCulture, CompareOptions.IgnoreSymbols);
}
}
Upvotes: 1
Reputation: 6965
Use regular expression and LINQ to order. You will need only two lines of code
Regex reg = new Regex(@"[^a-zA-Z]");
var result = input.OrderBy(x => reg.Replace(x, string.Empty)).ToArray();
Full sample of code
var input = new List<string>();
input.Add("(c");
input.Add("*b");
input.Add("_a");
Regex reg = new Regex(@"[^a-zA-Z]");
var result = input.OrderBy(x => reg.Replace(x, string.Empty)).ToArray();
Upvotes: 3
Reputation: 7526
Just clean it up before comparison.
cmembers.Sort(delegate (ChamberMembers x, ChamberMembers y)
{
if (x.companysortName == null && y.companysortName == null) return 0;
else if (x.companysortName == null) return -1;
else if (y.companysortName == null) return 1;
else return FilterSpecialChars(x.companysortName).CompareTo(FilterSpecialChars(y.companysortName));
});
public static string FilterSpecialChars(string str)
{
return ...;
}
Upvotes: 1