Andreas
Andreas

Reputation: 255

Sort a list by alphabet but ignore special characters

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

Answers (3)

Greg Uretzky
Greg Uretzky

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

Ray Krungkaew
Ray Krungkaew

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

eocron
eocron

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

Related Questions