Я могу вызвать функцию в лямбда-выражении?

Есть некоторые данные, которые недоступны при выполнении конструктора контроллеров.

Есть много вариантов решения этой проблемы, но я бы порекомендовал вам расширить BaseController и создать метод, который загружает данные из вашей корзины в переменную items. Благодаря этому вы можете расширить контроллеры, связанные с вашей корзиной, с вашего расширенного контроллера.

Другим вариантом может быть использование trait для хранения возможных операций по загрузке или обработке ваших товаров в корзине и добавление их туда, где вам нужно.

7
задан Jon Limjap 14 January 2009 в 07:45
поделиться

2 ответа

Да, это должно работать, если последовательность является последовательностью Story объекты; какую проблему Вы имеете? Отметьте это если Score не относится ни к какому экземпляру, могло бы стоить сделать это статичным.

Другая опция состоит в том, чтобы сделать Счет () методом метод экземпляра для a Story, или дополнительный метод.

Обратите внимание, что это только относится к LINQ к объектам; если Вы используете LINQ-SQL / LINQ к объектам, и т.д. Вы или должны использовать лямбду для всего этого, или (только в LINQ-SQL) используют UDF-отображенную функцию (на контексте данных) для вычисления значения.

Пример (LINQ к объектам) с Вашим исходным синтаксисом:

using System.Linq;
using System;
class Story { // declare type
    public DateTime PostedOn { get; set; }
    // simplified purely for convenience
    public int VotesCount { get; set; }
    public int CommentsCount { get; set; }
}
static class Program {
    static void Main() {
        // dummy data
        var data = new[] {
            new Story { PostedOn = DateTime.Today,
                VotesCount = 1, CommentsCount = 2},
            new Story { PostedOn = DateTime.Today.AddDays(-1),
                VotesCount = 5, CommentsCount = 22},
            new Story { PostedOn = DateTime.Today.AddDays(-2),
                VotesCount = 2, CommentsCount = 0}
        };
        var ordered = data.OrderByDescending(s=>Score(s));
        foreach (var row in ordered)
        {
            Console.WriteLine(row.PostedOn);
        }
    }

    private static double Score(Story s) {
        DateTime now = DateTime.Now;
        TimeSpan elapsed = now.Subtract(s.PostedOn);
        double daysAgo = elapsed.TotalDays;
        // simplified purely for convenience
        return s.VotesCount + s.CommentsCount - daysAgo;
    }
}

Добавьте a this (т.е. Score(this Story s)), и можно использовать:

.OrderByDescending(s=>s.Score())
4
ответ дан 7 December 2019 в 10:09
поделиться

На незначительной ноте можно записать

.OrderByDescending(Score)

так как подпись "Счета" выполняет необходимую подпись.

2
ответ дан 7 December 2019 в 10:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: