Есть некоторые данные, которые недоступны при выполнении конструктора контроллеров.
Есть много вариантов решения этой проблемы, но я бы порекомендовал вам расширить BaseController
и создать метод, который загружает данные из вашей корзины в переменную items. Благодаря этому вы можете расширить контроллеры, связанные с вашей корзиной, с вашего расширенного контроллера.
Другим вариантом может быть использование trait для хранения возможных операций по загрузке или обработке ваших товаров в корзине и добавление их туда, где вам нужно.
Да, это должно работать, если последовательность является последовательностью 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())
На незначительной ноте можно записать
.OrderByDescending(Score)
так как подпись "Счета" выполняет необходимую подпись.