Linq orderby сортировка по двум столбцам с пользовательским компаратором - PullRequest
3 голосов
/ 08 октября 2010
List<MyObject> objects = (from a in alist
    join b in blist on a.ID equals b.ID
    where a.Number != 4
    orderby b.Rank, a.CustomField
    select a).ToList();

Это мой запрос, и я хочу использовать собственный Comparer для свойства CustomField.Есть ли способ сделать это в порядке с двумя полями?

Я могу сделать это:

List<MyObject> objects = objects.OrderBy(a => a.CustomField, new MyComparer<object>())

, но мне нужно, чтобы он был отсортирован как s.Rank, так и.CustomField.

Ответы [ 2 ]

8 голосов
/ 08 октября 2010

Используйте OrderBy() вместе с ThenBy() с вашими пользовательскими компараторами.

// I'm pretty sure it is not possible to specify
// your custom comparer within a query expression
List<MyObject> objects = (from a in alist
                          join b in blist on a.ID equals b.ID
                          where a.Number != 4
                          select new { a, b })
                         .OrderBy(o => o.b.Rank, new MyRankComparer())
                         .ThenBy(o => o.a.CustomField, new MyComparer<object>())
                         .Select(o => o.a)
                         .ToList();
5 голосов
/ 08 октября 2010

Попробуйте:

List<MyObject> objects = objects
    .OrderBy(a => a.Rank)
    .ThenBy(a => 
        a.CustomField, new MyComparer<object>()
    ).ToList();

Сначала выполняется сортировка по полю Rank, а затем по CustomField с помощью пользовательского компаратора.

...