Sftp одной линии от терминала

Вам нужно использовать функцию сравнения, это функции, которые из двух экземпляров вашего типа возвращают целое число, возвращающее 0, если оба равны, отрицательное значение, если первое меньше второго и положительное значение, если первый больше, чем второй.

MSDN имеет nice table , который легче отслеживать, чем текст (StackOverflow по-прежнему не поддерживает таблицы в 2014 году)

IComparer

Большинство методов сортировки принимают пользовательскую реализацию сопоставления типа IComparer , вы должны создать один инкапсулирующий ваши пользовательские правила для Group:

class GroupComparer : IComparer
{
    public int Compare(Group a, Group b)
    {
        if (a != null && b != null && (a.Id == 0 || b.Id == 0))
        {
            if (a.Id == b.Id)
            {
                // Mandatory as some sort algorithms require Compare(a, b) and Compare(b, a) to be consitent
                return 0; 
            }
            return a.Id == 0 ? -1 : 1;
        }

        if (a == null || b == null)
        {
            if (ReferenceEquals(a, b))
            {
                return 0;
            }
            return a == null ? -1 : 1;
        }
        return Comparer.Default.Compare(a.Name, b.Name);
    }
}

Использование:

items.OrderBy(_ => _, new GroupAuthorityComparer());

IComparable

Если это единственный способ сравнить экземпляры Group, вы должны сделать его реализацией IComparable , чтобы дополнительный код не требовался, если кто-то хочет сортировать ваш класс:

class Group : IComparable
{
    ...

    public int CompareTo(Group b)
    {
        if (b != null && (Id == 0 || b.Id == 0))
        {
            if (Id == b.Id)
            {
                // Mandatory as some sort algorithms require Compare(a, b) and Compare(b, a) to be consitent
                return 0; 
            }
            return Id == 0 ? -1 : 1;
        }

        return Comparer.Default.Compare(Name, b.Name);
    }   
}

Использование:

items.OrderBy(_ => _.Group);

Выбор между одним путь или другое должно выполняться в зависимости от того, где используется этот конкретный компаратор: является ли это основным заказом для этого типа товара или просто для заказа который должен использоваться в одном конкретном случае, например, только в каком-то административном представлении.

Вы даже можете подняться на один уровень и обеспечить реализацию IComparable (это легко после реализации группы IComparable):

class GroupAuthority : IComparable
{
    ...

    public int CompareTo(GroupAuthority b)
    {
        return Comparer.Default.Compare(Group, b.Group);
    }
}

Использование:

items.OrderBy(_ => _);

Преимущество последнего состоит в том, что он будет использоваться автоматически, поэтому код типа: GroupAuthoritys.ToList().Sort() сделает правильную вещь из коробка.

66
задан Kyle 23 May 2013 в 19:02
поделиться