Расширение запроса Linq

У меня есть массив строк с именем Products, и я работаю над анонимными методами (Lambda Exprs.) и Linq. Итак, сначала я написал;

var resultSet1 = from p in products 
                 where p.StartsWith("M") 
                 orderby p descending  
                 select p;

Затем я расширяю его с помощью лямбда-выражений;

var resultSet2 = products
                 .Where(p => p.StartsWith("M"))
                 .OrderByDescending(p => p)
                 .Select(p => p);

Затем я расширяю его с помощью анонимных методов;

var resultSet3 = products
                .Where(delegate(string p) { return p.StartsWith("M"); })
                .OrderByDescending(delegate(string p) { return p; })
                .Select(delegate(string p) { return p; });

Затем я расширяю его с помощью Manual Methods и Func‹> Delegates;

Func<string, bool> filterFunc = new Func<string, bool>(Filter);
Func<string, string> orderAndSelectFunc = new Func<string, string>(OrderAndSelect);
var resultSet4 = products.Where(filterFunc).OrderByDescending(orderAndSelectFunc).Select(orderAndSelectFunc);

static bool Filter(string p) { return p.StartsWith("M"); }
static string OrderAndSelect(string p) { return p; }

Потом я застрял. Итак, мой вопрос; Могу ли я немного расширить это, заменив делегат Func‹> обычными делегатами? Или что-то вроде того?


person mimozz    schedule 12.03.2015    source источник


Ответы (2)


Затем я расширяю его с помощью лямбда-выражений...

Выражение .Select(p => p) не нужно в свободном синтаксисе. Вы можете удалить его.

Затем я расширяю его с помощью анонимных методов.

В этом случае лямбды — это просто укороченная версия ваших анонимных методов.

Могу ли я немного расширить это, заменив Func<> делегата обычными делегатами?

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

private static bool StartsWithM(string s) {
    return s.StartsWith("M");
}
private static string PassThrough(string s) {
    return s;
}
...
var resultSet4 = products
            .Where(StartsWithM)
            .OrderByDescending(PassThrough)
            .Select(PassThrough); // <<== Again, this can be removed
person Sergey Kalinichenko    schedule 12.03.2015

Не совсем уверен, чего вы хотите добиться, «удалив сахар» из оригиналов, но вы можете удалить лишние функции.

var resultSet4 = products.Where(Filter).OrderByDescending(OrderAndSelect).Select(orderAndSelect);

static bool Filter(string p) { return p.StartsWith("M"); }
static string OrderAndSelect(string p) { return p; }

Что касается расширения, я думаю, что это охватывает наиболее расширенный случай (если вы не разделяете «Заказ» и «Выбор»).

Возможно, вам будет полезно объяснить, почему вы хотите это сделать?

person neil danson    schedule 12.03.2015