Общая функция заказа Linq? - PullRequest
5 голосов
/ 08 июня 2009

Я хотел бы иметь возможность передавать Func , Который позволяет мне точно выбирать, как сортировать список элементов ... У меня проблема в том, что тип возвращаемого значения может различаться ... например, я хочу сделать что-то вроде этого (не рабочий код):

Func<POline, string> poLineOrder
if (option) poLineOrder = poline => poline.PartNumber;
else poLineOrder = poline => poline.LineOrder;
var orderedLines = poLines.OrderBy(poLineOrder);

Проблема здесь в том, что хотя PartNumber является строкой, LineOrder является целым числом, и этот код не компилируется. У меня такое чувство, что мне нужно будет создать выражение (?), Но я не могу понять синтаксис правильно.

(Да, я могу решить эту проблему, используя poline.LineOrder.ToString ("D10"), но я задаю более общий вопрос здесь ... спасибо!)

-mdb

Ответы [ 2 ]

5 голосов
/ 08 июня 2009

OrderBy ожидает функцию выбора ключа типа Func<Item, Key> и необязательный IComparer<Key> для определения самого сравнения.

Вам понадобятся следующие определения помощников:

 class FunctorComparer<T> : IComparer<T> {
        private readonly Comparison<T> m_Comparison;

        public FunctorComparer(Comparison<T> Comparison) {
            this.m_Comparison = Comparison;
        }

        public int Compare(T x, T y) {
            return m_Comparison(x, y);
        }
    }

    static Comparison<TKey> Compare<TKey, TRes>(Func<TKey, TRes> Selector) where TRes : IComparable<TRes> {
        return (x, y) => Selector(x).CompareTo(Selector(y));
    }

Теперь вы можете написать

Comparison<POLine> x;

if (option) 
   x = Compare<POLine, int>(l => l.PartNumber);
else
   x = Compare<POLine, string>(l => l.LineOrder);

var res = poLines.OrderBy(i => i, new FunctorComparer<POLine>(x));
3 голосов
/ 08 июня 2009

Возможно, вы захотите использовать Dynamic LINQ из VS2008 Samples . Тогда вы можете сделать:

var orderedLines = poLines.OrderBy( poLineOrder ? "PartNumber" : "LineOrder" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...