Это мой код:
IQueryable & lt; AuctionRecord & gt; records = db.AuctionRecord; var count = records.Count ();
Убедитесь, что переменная определена как IQueryable, а затем, когда вы используете метод Count (), EF выполнит что-то вроде
select count (*) from. ..
В противном случае, если записи определены как IEnumerable, созданный sql будет запрашивать всю таблицу и подсчитывать возвращаемые строки.
Вы также можете создать моноидный класс, который объединяет два списка, добавляя ко второму последнее значение из первого. Нет мутаций и не сгибов:
класс case CumSum (v: List [Int]) {def + (o: CumSum) = CumSum (v ::: (ov map (_ + v .last)))} определенный класс CumSum scala & gt; Список (1,2,3,4,5,6) map {v = & gt; CumSum (Список (v))} уменьшить (_ + _) res27: CumSum = CumSum (список (1, 3, 6, 10, 15, 21))
Я не уверен, почему все, кажется, настаивают на том, чтобы использовать какую-то фальцовку, в то время как вы в основном хотите сопоставить значения с кумулятивными значениями ...
val daysInMonths = List ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) val cumulated = daysInMonths.map {var s = 0; d = & gt; {s + = d; s}} // - & gt; Список [Int] = Список (31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)
foldLeft
используется var
s, поэтому их использование здесь является прекрасным IMO. Иногда изменяемые данные более эффективны и понятнее, и это хороший пример.
– Luigi Plinge
24 July 2011 в 01:10
map
, и что правила определения области охвата таковы, что содержится переменная. Я не видел этого в другом месте, но он открывает много дверей ...
– Jim Pivarski
8 June 2015 в 15:55
d = & gt; {s + = d; s}
. Однако эта лямбда содержит переменную s
из ее порождающего контекста, которую она «захватывает», поскольку Scala имеет не только что-то вроде указателей функций, но и реальных закрытий. См. [D0] stackoverflow.com/questions/208835/&hellip
– Landei
25 September 2015 в 14:32
Вставить в список вместо целого. Используйте пару (неполный список с накопленными значениями, сумматор с последней суммой) как состояние в сгибе.
Вы можете просто выполнить его:
daysInMonths.foldLeft ((0, List [Int] ())) {(acu, i) = & gt; (i + acu._1, i + acu._1 :: acu._2)} ._ 2.reverse
Scala 2.8 имеет методы scanLeft
и scanRight
, которые делают именно это.
Для 2.7 вы можете определить свой собственный scanLeft
следующим образом:
def scanLeft [a, b] (xs: Iterable [a]) (s: b) (f: (b, a) = & gt; b) = xs .foldLeft (List (s)) ((acc, x) = & gt; f (acc (0), x) :: acc) .reverse
И затем используйте его следующим образом:
scala & gt; scanLeft (Список (1,2,3)) (0) (_ + _) res1: Список [Int] = Список (0, 1, 3, 6)
Сложите список в новый список. На каждой итерации добавьте значение, которое представляет собой сумму головы + следующего входа. Затем измените все.
scala & gt; val daysInMonths = List (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) daysInMonths: List [Int] = List (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) scala & gt; daysInMonths.foldLeft (Nil: List [Int]) {(acc, next) = & gt; | acc.firstOption.map (_ + next) .getOrElse (next) :: acc | } .reverse res1: List [Int] = List (31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)
Работает на 2.7.7:
def stepSum (суммы: List [Int], шаги: List [Int]): List [Int] = шаги соответствуют {case Nil = & gt; sums.reverse.tail case x :: xs = & gt; stepSum (sums.head + x :: sums, steps.tail)} days res10: Список [Int] = Список (31, 28, 31, 30, 31) stepSum (Список (0), дней) res11: Список [Int ] = Список (31, 59, 90, 120, 151)