Суммарная сумма без var scala [duplicate]

Это мой код:

  IQueryable & lt; AuctionRecord & gt;  records = db.AuctionRecord;  var count = records.Count ();   

Убедитесь, что переменная определена как IQueryable, а затем, когда вы используете метод Count (), EF выполнит что-то вроде

  select count (*) from.  ..  

В противном случае, если записи определены как IEnumerable, созданный sql будет запрашивать всю таблицу и подсчитывать возвращаемые строки.

24
задан lindelof 11 July 2010 в 23:48
поделиться

7 ответов

Вы также можете создать моноидный класс, который объединяет два списка, добавляя ко второму последнее значение из первого. Нет мутаций и не сгибов:

  класс 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))  
1
ответ дан dividebyzero 15 August 2018 в 21:18
поделиться

Я не уверен, почему все, кажется, настаивают на том, чтобы использовать какую-то фальцовку, в то время как вы в основном хотите сопоставить значения с кумулятивными значениями ...

  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)  
16
ответ дан Landei 15 August 2018 в 21:18
поделиться
  • 1
    Потому что, если есть одно решение, использующее сгиб и другое решение с использованием изменяемых переменных, большинство людей (с фоном FP) выбрали бы сгиб. – sepp2k 12 July 2010 в 10:59
  • 2
    Я не вижу никаких проблем с этим: var не раскрывается, решение легко понять, коротко и легко читается, и расчет эффективен. Конечно, использование изменчивости должно быть ограничено и не переусердствовать, но неизменность - это всего лишь инструмент, а не догма - по крайней мере, на любом языке, который предлагает изменчивость. – Landei 12 July 2010 в 12:30
  • 3
    В определении foldLeft используется var s, поэтому их использование здесь является прекрасным IMO. Иногда изменяемые данные более эффективны и понятнее, и это хороший пример. – Luigi Plinge 24 July 2011 в 01:10
  • 4
    Вы знаете, что особенно приятно видеть это решение? Изучение того, что несколько выражений могут передаваться как аргумент map , и что правила определения области охвата таковы, что содержится переменная. Я не видел этого в другом месте, но он открывает много дверей ... – Jim Pivarski 8 June 2015 в 15:55
  • 5
    @Jim Pivarski: Если быть точным, то, что метод карты получает как аргумент, является только последней операцией блока, d = & gt; {s + = d; s} . Однако эта лямбда содержит переменную s из ее порождающего контекста, которую она «захватывает», поскольку Scala имеет не только что-то вроде указателей функций, но и реальных закрытий. См. [D0] stackoverflow.com/questions/208835/&hellip – Landei 25 September 2015 в 14:32

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

2
ответ дан Mau 15 August 2018 в 21:18
поделиться

Вы можете просто выполнить его:

  daysInMonths.foldLeft ((0, List [Int] ())) {(acu, i) = & gt; (i + acu._1,  i + acu._1 :: acu._2)} ._ 2.reverse  
6
ответ дан mucar 15 August 2018 в 21:18
поделиться

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)  
47
ответ дан sepp2k 15 August 2018 в 21:18
поделиться
  • 1
    Спасибо, но я могу использовать Scala 2.7 на данный момент ... – lindelof 12 July 2010 в 00:07
  • 2
    В заключение! Я действительно не мог поверить, что эта общая (?) Проблема не имела существующей абстракции. Спасибо за указание на это. – MEMark 21 April 2013 в 14:25
  • 3
    Также List (1, 2, 3) .scanLeft (0) (_ + _) . – Jus12 16 March 2014 в 21:49

Сложите список в новый список. На каждой итерации добавьте значение, которое представляет собой сумму головы + следующего входа. Затем измените все.

  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)  
1
ответ дан Synesso 15 August 2018 в 21:18
поделиться

Работает на 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)  
0
ответ дан user unknown 15 August 2018 в 21:18
поделиться
Другие вопросы по тегам:

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