Как преодолеть ArgumentException при сортировке с использованием интерфейса IComparer в C #? - PullRequest
0 голосов
/ 18 октября 2018

Я сортирую массив RowRanges, используя IComparer.Он работает нормально, когда диапазон строк достигает 16. После 16 возникает исключение, утверждающее, что сортировка не выполняется, и выдается исключение, указывающее, что Soting не может быть выполнена, поскольку сравниваются значения с самим собой и значениемповторно к другому .Во время отладки я обнаружил, что проблема возникает во время объектов, взятых для сравнения.Но как это исключение возникает после 16, а до 16 работает нормально?Пожалуйста, обратитесь к приведенному ниже фрагменту кода.

internal class ColComparer : IComparer
{

    public int Compare(object a, object b)
    {
        if (a == null || b == null)
        {
            return System.Collections.Comparer.Default.Compare(a, b);
        }

    GridRangeInfo r0 = (GridRangeInfo)a;
    GridRangeInfo r1 = (GridRangeInfo)b;

    if (r0 == r1)
    {
        return 0;
    }
    else
    {
        if (r0.RangeType == GridRangeInfoType.Table)
        {
            return -1;
        }
        else if (r1.RangeType == GridRangeInfoType.Table)
        {
            return 1;
        }
        else if (r0.RangeType == GridRangeInfoType.Rows)
        {
            return -1;
        }
        else if (r1.RangeType == GridRangeInfoType.Rows)
        {
            return 1;
        }
        else if (r0.Left != r1.Left)
        {
            return r0.Left - r1.Left;
        }
        else if (r0.Right != r1.Right)
        {
            return r0.Right - r1.Right;
        }
        else if (r0.Top != r1.Top)
        {
            return r0.Top - r1.Top;
        }
        else
        {
            return r0.Bottom - r1.Bottom;
        }
    }
}
}


class SortArray 
{
    //Array Data
    //

    GridRangeInfo[] ranges = new GridRangeInfo[this.Count];                 
    Array.Sort(ranges, new GridRangeInfo.ColComparer());
 }

Сообщите мне, где происходит исключение, и поделитесь вашими идеями, чтобы решить эту проблему.

Заранее спасибо,

Синдху

1 Ответ

0 голосов
/ 18 октября 2018

Такие условия, как r0.RangeType == GridRangeInfoType.Table .. return -1, дают нестабильный результат.Это потому, что это зависит от того, «какой» элемент равен r0 и r1.

Следуйте той же схеме if-then-return, что и для остальной части функции - где r0.X сравнивается с r1.X, а затем«что-то сделано на основе этого».

Например.

    if (r0.RangeType != r1.RangeType) {
    {
        if (r0.RangeType == GridRangeInfoType.Table) {
           return -1; // r0 first - prioritize 'Table' range types
        } else {
           return 1; // r1 first
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...