Вам нужно использовать функцию сравнения, это функции, которые из двух экземпляров вашего типа возвращают целое число, возвращающее 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()
сделает правильную вещь из коробка.
Или echo 'put {path to file}' | sftp {user}@{host}:{dir}
, который работал бы и в Unix и в powershell.