| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | using System.Collections.Generic;using System.Text;using MediaBrowser.Controller.Sorting;namespace Emby.Server.Implementations.Sorting{    public class AlphanumComparator : IComparer<string>    {        public static int CompareValues(string s1, string s2)        {            if (s1 == null || s2 == null)            {                return 0;            }            int thisMarker = 0, thisNumericChunk = 0;            int thatMarker = 0, thatNumericChunk = 0;            while ((thisMarker < s1.Length) || (thatMarker < s2.Length))            {                if (thisMarker >= s1.Length)                {                    return -1;                }                else if (thatMarker >= s2.Length)                {                    return 1;                }                char thisCh = s1[thisMarker];                char thatCh = s2[thatMarker];                StringBuilder thisChunk = new StringBuilder();                StringBuilder thatChunk = new StringBuilder();                while ((thisMarker < s1.Length) && (thisChunk.Length == 0 || SortHelper.InChunk(thisCh, thisChunk[0])))                {                    thisChunk.Append(thisCh);                    thisMarker++;                    if (thisMarker < s1.Length)                    {                        thisCh = s1[thisMarker];                    }                }                while ((thatMarker < s2.Length) && (thatChunk.Length == 0 || SortHelper.InChunk(thatCh, thatChunk[0])))                {                    thatChunk.Append(thatCh);                    thatMarker++;                    if (thatMarker < s2.Length)                    {                        thatCh = s2[thatMarker];                    }                }                int result = 0;                // If both chunks contain numeric characters, sort them numerically                if (char.IsDigit(thisChunk[0]) && char.IsDigit(thatChunk[0]))                {                    if (!int.TryParse(thisChunk.ToString(), out thisNumericChunk))                    {                        return 0;                    }                    if (!int.TryParse(thatChunk.ToString(), out thatNumericChunk))                    {                        return 0;                    }                    if (thisNumericChunk < thatNumericChunk)                    {                        result = -1;                    }                    if (thisNumericChunk > thatNumericChunk)                    {                        result = 1;                    }                }                else                {                    result = thisChunk.ToString().CompareTo(thatChunk.ToString());                }                if (result != 0)                {                    return result;                }            }            return 0;        }        public int Compare(string x, string y)        {            return CompareValues(x, y);        }    }}
 |