public static void AssignTo(ListView listView, params ColumnFormat[] formats)
 {
     var comparer = new ListViewItemTextComparer(listView);
     comparer.AddColumnFormats(formats);
 }
        public int Compare(object x, object y)
        {
            var itemX = x as ListViewItem;
            var itemY = y as ListViewItem;

            if (itemX == null || itemY == null) return -1;

            if (_sortColumn >= itemX.SubItems.Count) return -1;
            if (_sortColumn >= itemY.SubItems.Count) return -1;

            var xValue = itemX.SubItems[_sortColumn].Text;
            var yValue = itemY.SubItems[_sortColumn].Text;
            var compareValue = 0;
            var columnFormat = ColumnFormat.Text;

            if (_sortColumn < _columnFormats.Count)
            {
                try { columnFormat = (ColumnFormat)_columnFormats[_sortColumn]; }
                // ReSharper disable EmptyGeneralCatchClause
                catch { }
                // ReSharper restore EmptyGeneralCatchClause
            }

            // Special case, if the column format isn't tag and any string is empty, it shouldn't be parsed
            if (columnFormat != ColumnFormat.Tag)
            {
                if (xValue == "" && yValue == "") return 0;
                if (xValue == "") return SortDescending ? 1 : -1;
                if (yValue == "") return SortDescending ? -1 : 1;
            }

            // If the column format is percentage, strip any whitespace and '%' from the value and
            // change the column format to numeric
            if (columnFormat == ColumnFormat.Percentage)
            {
                xValue = xValue.Replace("%", "").Trim();
                yValue = yValue.Replace("%", "").Trim();
                columnFormat = ColumnFormat.Numeric;
            }

            if (columnFormat == ColumnFormat.NumericUnit)
            {
                xValue = DECIMAL_REGEX.Replace(xValue, "");
                yValue = DECIMAL_REGEX.Replace(yValue, "");
                columnFormat = ColumnFormat.Numeric;
            }

            try
            {
                compareValue = CompareValues(columnFormat, xValue, yValue, itemX, itemY);
            }
            // ReSharper disable EmptyGeneralCatchClause
            catch { }
            // ReSharper restore EmptyGeneralCatchClause

            if (compareValue == 0 && _secondSortColumn != -1 && _secondSortColumn != _sortColumn)
            {
                var comparer = new ListViewItemTextComparer
                    {
                        _columnFormats = _columnFormats,
                        SortColumn = _secondSortColumn
                    };
                compareValue = comparer.Compare(x, y);
            }

            return compareValue != 0 ? (SortDescending ? -compareValue : compareValue) : 1;
        }