Implementing custom IComparer with string

后端 未结 2 445
旧巷少年郎
旧巷少年郎 2020-12-01 23:46

I have a collection of strings in c#, for example;

var example = new string[]{\"c\", \"b\", \"a\", \"d\"};

I then with to sort this, but my

相关标签:
2条回答
  • 2020-12-02 00:04

    This should do what you want:

    var example = new string[]{"c", "a", "d", "b"};
    var comparer = new CustomStringComparer(StringComparer.CurrentCulture);
    Array.Sort(example, comparer);
    
    ...
    
    class CustomStringComparer : IComparer<string>
    {
        private readonly IComparer<string> _baseComparer;
        public CustomStringComparer(IComparer<string> baseComparer)
        {
            _baseComparer = baseComparer;
        }
    
        public int Compare(string x, string y)
        {
            if (_baseComparer.Compare(x, y) == 0)
                return 0;
    
            // "b" comes before everything else
            if (_baseComparer.Compare(x, "b") == 0)
                return -1;
            if (_baseComparer.Compare(y, "b") == 0)
                return 1;
    
            // "c" comes next
            if (_baseComparer.Compare(x, "c") == 0)
                return -1;
            if (_baseComparer.Compare(y, "c") == 0)
                return 1;
    
            return _baseComparer.Compare(x, y);
        }
    }
    
    0 讨论(0)
  • 2020-12-02 00:17

    A simple way is to substitute integers for the strings.

    class MyComparer : IComparer<string>
    {
        public override int Compare(string x, string y)
        {
            int ix = x == "b" ? 0 : x == "c" ? 1 : 2;
            int iy = y == "b" ? 0 : y == "c" ? 1 : 2;
            return ix.CompareTo(iy);
        }
    }
    
    var example = new List<string> { "c", "b", "a", "d", "foo", "", "1", "e"};
    example.Sort(new MyComparer());
    foreach (var s in example)
        Console.WriteLine(s);
    

    Output:

    b
    c

    1
    e
    a
    d
    foo

    Note that this isn't a stable sort. If you need a stable sort, there's a little more work involved.

    0 讨论(0)
提交回复
热议问题