Как вернуть «цепочку» вызовов OrderBy () для повторного использования - PullRequest
2 голосов
/ 21 января 2011

У меня есть следующий код LINQ-to-objects, который получает элементы в коллекции в определенном «сложном» порядке:

var items = this.Items.OrderBy(a => a.DisplayType == DisplayType.Integer ? 0 : 1)
                      .ThenBy(a => a.DisplayType == isplayType.String ? 0 : 1)
                      .ThenBy(a => a.Name);

Это работает очень хорошо.Тем не менее, я хочу иметь возможность повторно использовать эту «цепочку» без дублирования кода.

Я могу сделать это хорошо, хотя все типы свойств, по которым мы сортируем, одинаковы:

private static Func<Column, int> GetOrderBy()
{
    return a => a.DisplayType == FieldDisplayType.Integer ? 0 :
        a.DisplayType == FieldDisplayType.String ? 1 : 2;
}

var items = this.Items.OrderBy(GetOrderBy());

но тогда я не вижу, как я могу включить a.Name - потому что тип возвращаемого значения - Func, а Column.Name - строка.

Любая помощь приветствуется.

Том

1 Ответ

7 голосов
/ 21 января 2011

Если вы хотите повторно использовать этот порядок, я бы написал метод расширения, который применяет порядок вместо вызова OrderBy:

internal static IOrderedEnumerable<Column> OrderByDefaults
    (this IEnumerable<Column> source)
{
    return source.OrderBy(a => a.DisplayType != FieldDisplayType.Integer)
                 .ThenBy(a => a.DisplayType != FieldDisplayType.String);
}

, затем назовите его с помощью:

var items = this.Items.OrderByDefaults()
                      .ThenBy(a => a.Name);

Два очка:

  • Я не беспокоился о целых числах: "false" сортирует меньше, чем "true", поэтому я считаю, что это делает то, что вы хотите. Вы можете вернуться к использованию целых чисел для каждого свойства, хотя
  • Недостаток этого подхода заключается в том, что для метода расширения необходим статический неуниверсальный тип верхнего уровня.

Я бы определенно придерживался OrderBy / ThenBy / ThenBy вместо того, чтобы создавать собственный большой компаратор с условным предложением - просто потому, что его намного легче читать, IMO.

...