QueryLanguage.Aggregates.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT License.
  3. // See the LICENSE file in the project root for more information.
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. namespace System.Reactive.Linq
  7. {
  8. using ObservableImpl;
  9. internal partial class QueryLanguage
  10. {
  11. #region + Aggregate +
  12. public virtual IObservable<TAccumulate> Aggregate<TSource, TAccumulate>(IObservable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> accumulator)
  13. {
  14. return new Aggregate<TSource, TAccumulate>(source, seed, accumulator);
  15. }
  16. public virtual IObservable<TResult> Aggregate<TSource, TAccumulate, TResult>(IObservable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> accumulator, Func<TAccumulate, TResult> resultSelector)
  17. {
  18. return new Aggregate<TSource, TAccumulate, TResult>(source, seed, accumulator, resultSelector);
  19. }
  20. public virtual IObservable<TSource> Aggregate<TSource>(IObservable<TSource> source, Func<TSource, TSource, TSource> accumulator)
  21. {
  22. return new Aggregate<TSource>(source, accumulator);
  23. }
  24. public virtual IObservable<double> Average<TSource>(IObservable<TSource> source, Func<TSource, double> selector)
  25. {
  26. return Average(Select(source, selector));
  27. }
  28. public virtual IObservable<float> Average<TSource>(IObservable<TSource> source, Func<TSource, float> selector)
  29. {
  30. return Average(Select(source, selector));
  31. }
  32. public virtual IObservable<decimal> Average<TSource>(IObservable<TSource> source, Func<TSource, decimal> selector)
  33. {
  34. return Average(Select(source, selector));
  35. }
  36. public virtual IObservable<double> Average<TSource>(IObservable<TSource> source, Func<TSource, int> selector)
  37. {
  38. return Average(Select(source, selector));
  39. }
  40. public virtual IObservable<double> Average<TSource>(IObservable<TSource> source, Func<TSource, long> selector)
  41. {
  42. return Average(Select(source, selector));
  43. }
  44. public virtual IObservable<double?> Average<TSource>(IObservable<TSource> source, Func<TSource, double?> selector)
  45. {
  46. return Average(Select(source, selector));
  47. }
  48. public virtual IObservable<float?> Average<TSource>(IObservable<TSource> source, Func<TSource, float?> selector)
  49. {
  50. return Average(Select(source, selector));
  51. }
  52. public virtual IObservable<decimal?> Average<TSource>(IObservable<TSource> source, Func<TSource, decimal?> selector)
  53. {
  54. return Average(Select(source, selector));
  55. }
  56. public virtual IObservable<double?> Average<TSource>(IObservable<TSource> source, Func<TSource, int?> selector)
  57. {
  58. return Average(Select(source, selector));
  59. }
  60. public virtual IObservable<double?> Average<TSource>(IObservable<TSource> source, Func<TSource, long?> selector)
  61. {
  62. return Average(Select(source, selector));
  63. }
  64. #endregion
  65. #region + All +
  66. public virtual IObservable<bool> All<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  67. {
  68. return new All<TSource>(source, predicate);
  69. }
  70. #endregion
  71. #region + Any +
  72. public virtual IObservable<bool> Any<TSource>(IObservable<TSource> source)
  73. {
  74. return new Any<TSource>.Count(source);
  75. }
  76. public virtual IObservable<bool> Any<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  77. {
  78. return new Any<TSource>.Predicate(source, predicate);
  79. }
  80. #endregion
  81. #region + Average +
  82. public virtual IObservable<double> Average(IObservable<double> source)
  83. {
  84. return new AverageDouble(source);
  85. }
  86. public virtual IObservable<float> Average(IObservable<float> source)
  87. {
  88. return new AverageSingle(source);
  89. }
  90. public virtual IObservable<decimal> Average(IObservable<decimal> source)
  91. {
  92. return new AverageDecimal(source);
  93. }
  94. public virtual IObservable<double> Average(IObservable<int> source)
  95. {
  96. return new AverageInt32(source);
  97. }
  98. public virtual IObservable<double> Average(IObservable<long> source)
  99. {
  100. return new AverageInt64(source);
  101. }
  102. public virtual IObservable<double?> Average(IObservable<double?> source)
  103. {
  104. return new AverageDoubleNullable(source);
  105. }
  106. public virtual IObservable<float?> Average(IObservable<float?> source)
  107. {
  108. return new AverageSingleNullable(source);
  109. }
  110. public virtual IObservable<decimal?> Average(IObservable<decimal?> source)
  111. {
  112. return new AverageDecimalNullable(source);
  113. }
  114. public virtual IObservable<double?> Average(IObservable<int?> source)
  115. {
  116. return new AverageInt32Nullable(source);
  117. }
  118. public virtual IObservable<double?> Average(IObservable<long?> source)
  119. {
  120. return new AverageInt64Nullable(source);
  121. }
  122. #endregion
  123. #region + Contains +
  124. public virtual IObservable<bool> Contains<TSource>(IObservable<TSource> source, TSource value)
  125. {
  126. return new Contains<TSource>(source, value, EqualityComparer<TSource>.Default);
  127. }
  128. public virtual IObservable<bool> Contains<TSource>(IObservable<TSource> source, TSource value, IEqualityComparer<TSource> comparer)
  129. {
  130. return new Contains<TSource>(source, value, comparer);
  131. }
  132. #endregion
  133. #region + Count +
  134. public virtual IObservable<int> Count<TSource>(IObservable<TSource> source)
  135. {
  136. return new Count<TSource>.All(source);
  137. }
  138. public virtual IObservable<int> Count<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  139. {
  140. return new Count<TSource>.Predicate(source, predicate);
  141. }
  142. #endregion
  143. #region + ElementAt +
  144. public virtual IObservable<TSource> ElementAt<TSource>(IObservable<TSource> source, int index)
  145. {
  146. return new ElementAt<TSource>(source, index);
  147. }
  148. #endregion
  149. #region + ElementAtOrDefault +
  150. public virtual IObservable<TSource> ElementAtOrDefault<TSource>(IObservable<TSource> source, int index)
  151. {
  152. return new ElementAtOrDefault<TSource>(source, index);
  153. }
  154. #endregion
  155. #region + FirstAsync +
  156. public virtual IObservable<TSource> FirstAsync<TSource>(IObservable<TSource> source)
  157. {
  158. return new FirstAsync<TSource>.Sequence(source);
  159. }
  160. public virtual IObservable<TSource> FirstAsync<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  161. {
  162. return new FirstAsync<TSource>.Predicate(source, predicate);
  163. }
  164. #endregion
  165. #region + FirstAsyncOrDefaultAsync +
  166. public virtual IObservable<TSource> FirstOrDefaultAsync<TSource>(IObservable<TSource> source)
  167. {
  168. return new FirstOrDefaultAsync<TSource>.Sequence(source);
  169. }
  170. public virtual IObservable<TSource> FirstOrDefaultAsync<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  171. {
  172. return new FirstOrDefaultAsync<TSource>.Predicate(source, predicate);
  173. }
  174. #endregion
  175. #region + IsEmpty +
  176. public virtual IObservable<bool> IsEmpty<TSource>(IObservable<TSource> source)
  177. {
  178. return new IsEmpty<TSource>(source);
  179. }
  180. #endregion
  181. #region + LastAsync +
  182. public virtual IObservable<TSource> LastAsync<TSource>(IObservable<TSource> source)
  183. {
  184. return new LastAsync<TSource>.Sequence(source);
  185. }
  186. public virtual IObservable<TSource> LastAsync<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  187. {
  188. return new LastAsync<TSource>.Predicate(source, predicate);
  189. }
  190. #endregion
  191. #region + LastOrDefaultAsync +
  192. public virtual IObservable<TSource> LastOrDefaultAsync<TSource>(IObservable<TSource> source)
  193. {
  194. return new LastOrDefaultAsync<TSource>.Sequence(source);
  195. }
  196. public virtual IObservable<TSource> LastOrDefaultAsync<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  197. {
  198. return new LastOrDefaultAsync<TSource>.Predicate(source, predicate);
  199. }
  200. #endregion
  201. #region + LongCount +
  202. public virtual IObservable<long> LongCount<TSource>(IObservable<TSource> source)
  203. {
  204. return new LongCount<TSource>.All(source);
  205. }
  206. public virtual IObservable<long> LongCount<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  207. {
  208. return new LongCount<TSource>.Predicate(source, predicate);
  209. }
  210. #endregion
  211. #region + Max +
  212. public virtual IObservable<TSource> Max<TSource>(IObservable<TSource> source)
  213. {
  214. // BREAKING CHANGE v2 > v1.x - Behavior for reference types
  215. return new Max<TSource>(source, Comparer<TSource>.Default);
  216. }
  217. public virtual IObservable<TSource> Max<TSource>(IObservable<TSource> source, IComparer<TSource> comparer)
  218. {
  219. // BREAKING CHANGE v2 > v1.x - Behavior for reference types
  220. return new Max<TSource>(source, comparer);
  221. }
  222. public virtual IObservable<double> Max(IObservable<double> source)
  223. {
  224. return new MaxDouble(source);
  225. }
  226. public virtual IObservable<float> Max(IObservable<float> source)
  227. {
  228. return new MaxSingle(source);
  229. }
  230. public virtual IObservable<decimal> Max(IObservable<decimal> source)
  231. {
  232. return new MaxDecimal(source);
  233. }
  234. public virtual IObservable<int> Max(IObservable<int> source)
  235. {
  236. return new MaxInt32(source);
  237. }
  238. public virtual IObservable<long> Max(IObservable<long> source)
  239. {
  240. return new MaxInt64(source);
  241. }
  242. public virtual IObservable<double?> Max(IObservable<double?> source)
  243. {
  244. return new MaxDoubleNullable(source);
  245. }
  246. public virtual IObservable<float?> Max(IObservable<float?> source)
  247. {
  248. return new MaxSingleNullable(source);
  249. }
  250. public virtual IObservable<decimal?> Max(IObservable<decimal?> source)
  251. {
  252. return new MaxDecimalNullable(source);
  253. }
  254. public virtual IObservable<int?> Max(IObservable<int?> source)
  255. {
  256. return new MaxInt32Nullable(source);
  257. }
  258. public virtual IObservable<long?> Max(IObservable<long?> source)
  259. {
  260. return new MaxInt64Nullable(source);
  261. }
  262. public virtual IObservable<TResult> Max<TSource, TResult>(IObservable<TSource> source, Func<TSource, TResult> selector)
  263. {
  264. return Max(Select(source, selector));
  265. }
  266. public virtual IObservable<TResult> Max<TSource, TResult>(IObservable<TSource> source, Func<TSource, TResult> selector, IComparer<TResult> comparer)
  267. {
  268. return Max(Select(source, selector), comparer);
  269. }
  270. public virtual IObservable<double> Max<TSource>(IObservable<TSource> source, Func<TSource, double> selector)
  271. {
  272. return Max(Select(source, selector));
  273. }
  274. public virtual IObservable<float> Max<TSource>(IObservable<TSource> source, Func<TSource, float> selector)
  275. {
  276. return Max(Select(source, selector));
  277. }
  278. public virtual IObservable<decimal> Max<TSource>(IObservable<TSource> source, Func<TSource, decimal> selector)
  279. {
  280. return Max(Select(source, selector));
  281. }
  282. public virtual IObservable<int> Max<TSource>(IObservable<TSource> source, Func<TSource, int> selector)
  283. {
  284. return Max(Select(source, selector));
  285. }
  286. public virtual IObservable<long> Max<TSource>(IObservable<TSource> source, Func<TSource, long> selector)
  287. {
  288. return Max(Select(source, selector));
  289. }
  290. public virtual IObservable<double?> Max<TSource>(IObservable<TSource> source, Func<TSource, double?> selector)
  291. {
  292. return Max(Select(source, selector));
  293. }
  294. public virtual IObservable<float?> Max<TSource>(IObservable<TSource> source, Func<TSource, float?> selector)
  295. {
  296. return Max(Select(source, selector));
  297. }
  298. public virtual IObservable<decimal?> Max<TSource>(IObservable<TSource> source, Func<TSource, decimal?> selector)
  299. {
  300. return Max(Select(source, selector));
  301. }
  302. public virtual IObservable<int?> Max<TSource>(IObservable<TSource> source, Func<TSource, int?> selector)
  303. {
  304. return Max(Select(source, selector));
  305. }
  306. public virtual IObservable<long?> Max<TSource>(IObservable<TSource> source, Func<TSource, long?> selector)
  307. {
  308. return Max(Select(source, selector));
  309. }
  310. #endregion
  311. #region + MaxBy +
  312. public virtual IObservable<IList<TSource>> MaxBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector)
  313. {
  314. return new MaxBy<TSource, TKey>(source, keySelector, Comparer<TKey>.Default);
  315. }
  316. public virtual IObservable<IList<TSource>> MaxBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
  317. {
  318. return new MaxBy<TSource, TKey>(source, keySelector, comparer);
  319. }
  320. #endregion
  321. #region + Min +
  322. public virtual IObservable<TSource> Min<TSource>(IObservable<TSource> source)
  323. {
  324. // BREAKING CHANGE v2 > v1.x - Behavior for reference types
  325. return new Min<TSource>(source, Comparer<TSource>.Default);
  326. }
  327. public virtual IObservable<TSource> Min<TSource>(IObservable<TSource> source, IComparer<TSource> comparer)
  328. {
  329. // BREAKING CHANGE v2 > v1.x - Behavior for reference types
  330. return new Min<TSource>(source, comparer);
  331. }
  332. public virtual IObservable<double> Min(IObservable<double> source)
  333. {
  334. return new MinDouble(source);
  335. }
  336. public virtual IObservable<float> Min(IObservable<float> source)
  337. {
  338. return new MinSingle(source);
  339. }
  340. public virtual IObservable<decimal> Min(IObservable<decimal> source)
  341. {
  342. return new MinDecimal(source);
  343. }
  344. public virtual IObservable<int> Min(IObservable<int> source)
  345. {
  346. return new MinInt32(source);
  347. }
  348. public virtual IObservable<long> Min(IObservable<long> source)
  349. {
  350. return new MinInt64(source);
  351. }
  352. public virtual IObservable<double?> Min(IObservable<double?> source)
  353. {
  354. return new MinDoubleNullable(source);
  355. }
  356. public virtual IObservable<float?> Min(IObservable<float?> source)
  357. {
  358. return new MinSingleNullable(source);
  359. }
  360. public virtual IObservable<decimal?> Min(IObservable<decimal?> source)
  361. {
  362. return new MinDecimalNullable(source);
  363. }
  364. public virtual IObservable<int?> Min(IObservable<int?> source)
  365. {
  366. return new MinInt32Nullable(source);
  367. }
  368. public virtual IObservable<long?> Min(IObservable<long?> source)
  369. {
  370. return new MinInt64Nullable(source);
  371. }
  372. public virtual IObservable<TResult> Min<TSource, TResult>(IObservable<TSource> source, Func<TSource, TResult> selector)
  373. {
  374. return Min(Select(source, selector));
  375. }
  376. public virtual IObservable<TResult> Min<TSource, TResult>(IObservable<TSource> source, Func<TSource, TResult> selector, IComparer<TResult> comparer)
  377. {
  378. return Min(Select(source, selector), comparer);
  379. }
  380. public virtual IObservable<double> Min<TSource>(IObservable<TSource> source, Func<TSource, double> selector)
  381. {
  382. return Min(Select(source, selector));
  383. }
  384. public virtual IObservable<float> Min<TSource>(IObservable<TSource> source, Func<TSource, float> selector)
  385. {
  386. return Min(Select(source, selector));
  387. }
  388. public virtual IObservable<decimal> Min<TSource>(IObservable<TSource> source, Func<TSource, decimal> selector)
  389. {
  390. return Min(Select(source, selector));
  391. }
  392. public virtual IObservable<int> Min<TSource>(IObservable<TSource> source, Func<TSource, int> selector)
  393. {
  394. return Min(Select(source, selector));
  395. }
  396. public virtual IObservable<long> Min<TSource>(IObservable<TSource> source, Func<TSource, long> selector)
  397. {
  398. return Min(Select(source, selector));
  399. }
  400. public virtual IObservable<double?> Min<TSource>(IObservable<TSource> source, Func<TSource, double?> selector)
  401. {
  402. return Min(Select(source, selector));
  403. }
  404. public virtual IObservable<float?> Min<TSource>(IObservable<TSource> source, Func<TSource, float?> selector)
  405. {
  406. return Min(Select(source, selector));
  407. }
  408. public virtual IObservable<decimal?> Min<TSource>(IObservable<TSource> source, Func<TSource, decimal?> selector)
  409. {
  410. return Min(Select(source, selector));
  411. }
  412. public virtual IObservable<int?> Min<TSource>(IObservable<TSource> source, Func<TSource, int?> selector)
  413. {
  414. return Min(Select(source, selector));
  415. }
  416. public virtual IObservable<long?> Min<TSource>(IObservable<TSource> source, Func<TSource, long?> selector)
  417. {
  418. return Min(Select(source, selector));
  419. }
  420. #endregion
  421. #region + MinBy +
  422. public virtual IObservable<IList<TSource>> MinBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector)
  423. {
  424. return new MinBy<TSource, TKey>(source, keySelector, Comparer<TKey>.Default);
  425. }
  426. public virtual IObservable<IList<TSource>> MinBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
  427. {
  428. return new MinBy<TSource, TKey>(source, keySelector, comparer);
  429. }
  430. #endregion
  431. #region + SequenceEqual +
  432. public virtual IObservable<bool> SequenceEqual<TSource>(IObservable<TSource> first, IObservable<TSource> second)
  433. {
  434. return new SequenceEqual<TSource>.Observable(first, second, EqualityComparer<TSource>.Default);
  435. }
  436. public virtual IObservable<bool> SequenceEqual<TSource>(IObservable<TSource> first, IObservable<TSource> second, IEqualityComparer<TSource> comparer)
  437. {
  438. return new SequenceEqual<TSource>.Observable(first, second, comparer);
  439. }
  440. public virtual IObservable<bool> SequenceEqual<TSource>(IObservable<TSource> first, IEnumerable<TSource> second)
  441. {
  442. return new SequenceEqual<TSource>.Enumerable(first, second, EqualityComparer<TSource>.Default);
  443. }
  444. public virtual IObservable<bool> SequenceEqual<TSource>(IObservable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
  445. {
  446. return new SequenceEqual<TSource>.Enumerable(first, second, comparer);
  447. }
  448. #endregion
  449. #region + SingleAsync +
  450. public virtual IObservable<TSource> SingleAsync<TSource>(IObservable<TSource> source)
  451. {
  452. return new SingleAsync<TSource>.Sequence(source);
  453. }
  454. public virtual IObservable<TSource> SingleAsync<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  455. {
  456. return new SingleAsync<TSource>.Predicate(source, predicate);
  457. }
  458. #endregion
  459. #region + SingleOrDefaultAsync +
  460. public virtual IObservable<TSource> SingleOrDefaultAsync<TSource>(IObservable<TSource> source)
  461. {
  462. return new SingleOrDefaultAsync<TSource>.Sequence(source);
  463. }
  464. public virtual IObservable<TSource> SingleOrDefaultAsync<TSource>(IObservable<TSource> source, Func<TSource, bool> predicate)
  465. {
  466. return new SingleOrDefaultAsync<TSource>.Predicate(source, predicate);
  467. }
  468. #endregion
  469. #region + Sum +
  470. public virtual IObservable<double> Sum(IObservable<double> source)
  471. {
  472. return new SumDouble(source);
  473. }
  474. public virtual IObservable<float> Sum(IObservable<float> source)
  475. {
  476. return new SumSingle(source);
  477. }
  478. public virtual IObservable<decimal> Sum(IObservable<decimal> source)
  479. {
  480. return new SumDecimal(source);
  481. }
  482. public virtual IObservable<int> Sum(IObservable<int> source)
  483. {
  484. return new SumInt32(source);
  485. }
  486. public virtual IObservable<long> Sum(IObservable<long> source)
  487. {
  488. return new SumInt64(source);
  489. }
  490. public virtual IObservable<double?> Sum(IObservable<double?> source)
  491. {
  492. return new SumDoubleNullable(source);
  493. }
  494. public virtual IObservable<float?> Sum(IObservable<float?> source)
  495. {
  496. return new SumSingleNullable(source);
  497. }
  498. public virtual IObservable<decimal?> Sum(IObservable<decimal?> source)
  499. {
  500. return new SumDecimalNullable(source);
  501. }
  502. public virtual IObservable<int?> Sum(IObservable<int?> source)
  503. {
  504. return new SumInt32Nullable(source);
  505. }
  506. public virtual IObservable<long?> Sum(IObservable<long?> source)
  507. {
  508. return new SumInt64Nullable(source);
  509. }
  510. public virtual IObservable<double> Sum<TSource>(IObservable<TSource> source, Func<TSource, double> selector)
  511. {
  512. return Sum(Select(source, selector));
  513. }
  514. public virtual IObservable<float> Sum<TSource>(IObservable<TSource> source, Func<TSource, float> selector)
  515. {
  516. return Sum(Select(source, selector));
  517. }
  518. public virtual IObservable<decimal> Sum<TSource>(IObservable<TSource> source, Func<TSource, decimal> selector)
  519. {
  520. return Sum(Select(source, selector));
  521. }
  522. public virtual IObservable<int> Sum<TSource>(IObservable<TSource> source, Func<TSource, int> selector)
  523. {
  524. return Sum(Select(source, selector));
  525. }
  526. public virtual IObservable<long> Sum<TSource>(IObservable<TSource> source, Func<TSource, long> selector)
  527. {
  528. return Sum(Select(source, selector));
  529. }
  530. public virtual IObservable<double?> Sum<TSource>(IObservable<TSource> source, Func<TSource, double?> selector)
  531. {
  532. return Sum(Select(source, selector));
  533. }
  534. public virtual IObservable<float?> Sum<TSource>(IObservable<TSource> source, Func<TSource, float?> selector)
  535. {
  536. return Sum(Select(source, selector));
  537. }
  538. public virtual IObservable<decimal?> Sum<TSource>(IObservable<TSource> source, Func<TSource, decimal?> selector)
  539. {
  540. return Sum(Select(source, selector));
  541. }
  542. public virtual IObservable<int?> Sum<TSource>(IObservable<TSource> source, Func<TSource, int?> selector)
  543. {
  544. return Sum(Select(source, selector));
  545. }
  546. public virtual IObservable<long?> Sum<TSource>(IObservable<TSource> source, Func<TSource, long?> selector)
  547. {
  548. return Sum(Select(source, selector));
  549. }
  550. #endregion
  551. #region + ToArray +
  552. public virtual IObservable<TSource[]> ToArray<TSource>(IObservable<TSource> source)
  553. {
  554. return new ToArray<TSource>(source);
  555. }
  556. #endregion
  557. #region + ToDictionary +
  558. public virtual IObservable<IDictionary<TKey, TElement>> ToDictionary<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
  559. {
  560. return new ToDictionary<TSource, TKey, TElement>(source, keySelector, elementSelector, comparer);
  561. }
  562. public virtual IObservable<IDictionary<TKey, TElement>> ToDictionary<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
  563. {
  564. return new ToDictionary<TSource, TKey, TElement>(source, keySelector, elementSelector, EqualityComparer<TKey>.Default);
  565. }
  566. public virtual IObservable<IDictionary<TKey, TSource>> ToDictionary<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
  567. {
  568. return new ToDictionary<TSource, TKey, TSource>(source, keySelector, x => x, comparer);
  569. }
  570. public virtual IObservable<IDictionary<TKey, TSource>> ToDictionary<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector)
  571. {
  572. return new ToDictionary<TSource, TKey, TSource>(source, keySelector, x => x, EqualityComparer<TKey>.Default);
  573. }
  574. #endregion
  575. #region + ToList +
  576. public virtual IObservable<IList<TSource>> ToList<TSource>(IObservable<TSource> source)
  577. {
  578. return new ToList<TSource>(source);
  579. }
  580. #endregion
  581. #region + ToLookup +
  582. public virtual IObservable<ILookup<TKey, TElement>> ToLookup<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
  583. {
  584. return new ToLookup<TSource, TKey, TElement>(source, keySelector, elementSelector, comparer);
  585. }
  586. public virtual IObservable<ILookup<TKey, TSource>> ToLookup<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
  587. {
  588. return new ToLookup<TSource, TKey, TSource>(source, keySelector, x => x, comparer);
  589. }
  590. public virtual IObservable<ILookup<TKey, TElement>> ToLookup<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
  591. {
  592. return new ToLookup<TSource, TKey, TElement>(source, keySelector, elementSelector, EqualityComparer<TKey>.Default);
  593. }
  594. public virtual IObservable<ILookup<TKey, TSource>> ToLookup<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector)
  595. {
  596. return new ToLookup<TSource, TKey, TSource>(source, keySelector, x => x, EqualityComparer<TKey>.Default);
  597. }
  598. #endregion
  599. }
  600. }