QueryExpression.cs 129 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002
  1. // Permission is hereby granted, free of charge, to any person obtaining
  2. // a copy of this software and associated documentation files (the
  3. // "Software"), to deal in the Software without restriction, including
  4. // without limitation the rights to use, copy, modify, merge, publish,
  5. // distribute, sublicense, and/or sell copies of the Software, and to
  6. // permit persons to whom the Software is furnished to do so, subject to
  7. // the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be
  10. // included in all copies or substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  13. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  14. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  15. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  16. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  17. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  18. //
  19. // Authors:
  20. // Alejandro Serrano "Serras" ([email protected])
  21. //
  22. using System;
  23. using System.Collections.Generic;
  24. namespace System.Linq
  25. {
  26. [System.Runtime.CompilerServices.Extension]
  27. public static class QueryExpression
  28. {
  29. #region Count
  30. [System.Runtime.CompilerServices.Extension]
  31. public static int Count<T> (
  32. IEnumerable<T> source)
  33. {
  34. if (source == null)
  35. throw new ArgumentNullException ();
  36. if (source is ICollection<T>)
  37. return ((ICollection<T>)source).Count;
  38. else {
  39. int counter = 0;
  40. foreach (T element in source)
  41. counter++;
  42. return counter;
  43. }
  44. }
  45. [System.Runtime.CompilerServices.Extension]
  46. public static int Count<T> (
  47. IEnumerable<T> source,
  48. Func<T, bool> selector)
  49. {
  50. if (source == null || selector == null)
  51. throw new ArgumentNullException ();
  52. int counter = 0;
  53. foreach (T element in source)
  54. if (selector(element))
  55. counter++;
  56. return counter;
  57. }
  58. #endregion
  59. #region LongCount
  60. [System.Runtime.CompilerServices.Extension]
  61. public static long LongCount<T> (
  62. IEnumerable<T> source)
  63. {
  64. if (source == null)
  65. throw new ArgumentNullException ();
  66. long counter = 0;
  67. foreach (T element in source)
  68. counter++;
  69. return counter;
  70. }
  71. [System.Runtime.CompilerServices.Extension]
  72. public static long LongCount<T> (
  73. IEnumerable<T> source,
  74. Func<T, bool> selector)
  75. {
  76. if (source == null || selector == null)
  77. throw new ArgumentNullException ();
  78. long counter = 0;
  79. foreach (T element in source)
  80. if (selector(element))
  81. counter++;
  82. return counter;
  83. }
  84. #endregion
  85. #region Sum
  86. [System.Runtime.CompilerServices.Extension]
  87. public static int Sum (
  88. IEnumerable<int> source)
  89. {
  90. if (source == null)
  91. throw new ArgumentNullException ();
  92. int sum = 0;
  93. foreach (int element in source)
  94. sum += element;
  95. return sum;
  96. }
  97. [System.Runtime.CompilerServices.Extension]
  98. public static int Sum<T> (
  99. IEnumerable<T> source,
  100. Func<T, int> selector)
  101. {
  102. if (source == null || selector == null)
  103. throw new ArgumentNullException ();
  104. int sum = 0;
  105. foreach (T element in source)
  106. sum += selector (element);
  107. return sum;
  108. }
  109. [System.Runtime.CompilerServices.Extension]
  110. public static int? Sum (
  111. IEnumerable<int?> source)
  112. {
  113. if (source == null)
  114. throw new ArgumentNullException ();
  115. int? sum = 0;
  116. foreach (int? element in source)
  117. if (element.HasValue)
  118. sum += element.Value;
  119. return sum;
  120. }
  121. [System.Runtime.CompilerServices.Extension]
  122. public static int? Sum<T> (
  123. IEnumerable<T> source,
  124. Func<T, int?> selector)
  125. {
  126. if (source == null || selector == null)
  127. throw new ArgumentNullException ();
  128. int? sum = 0;
  129. foreach (T element in source) {
  130. int? item = selector (element);
  131. if (item.HasValue)
  132. sum += item.Value;
  133. }
  134. return sum;
  135. }
  136. [System.Runtime.CompilerServices.Extension]
  137. public static long Sum (
  138. IEnumerable<long> source)
  139. {
  140. if (source == null)
  141. throw new ArgumentNullException ();
  142. long sum = 0;
  143. foreach (long element in source)
  144. sum += element;
  145. return sum;
  146. }
  147. [System.Runtime.CompilerServices.Extension]
  148. public static long Sum<T> (
  149. IEnumerable<T> source,
  150. Func<T, long> selector)
  151. {
  152. if (source == null || selector == null)
  153. throw new ArgumentNullException ();
  154. long sum = 0;
  155. foreach (T element in source)
  156. sum += selector (element);
  157. return sum;
  158. }
  159. [System.Runtime.CompilerServices.Extension]
  160. public static long? Sum (
  161. IEnumerable<long?> source)
  162. {
  163. if (source == null)
  164. throw new ArgumentNullException ();
  165. long? sum = 0;
  166. foreach (long? element in source)
  167. if (element.HasValue)
  168. sum += element.Value;
  169. return sum;
  170. }
  171. [System.Runtime.CompilerServices.Extension]
  172. public static long? Sum<T> (
  173. IEnumerable<T> source,
  174. Func<T, long?> selector)
  175. {
  176. if (source == null || selector == null)
  177. throw new ArgumentNullException ();
  178. long? sum = 0;
  179. foreach (T element in source) {
  180. long? item = selector (element);
  181. if (item.HasValue)
  182. sum += item.Value;
  183. }
  184. return sum;
  185. }
  186. [System.Runtime.CompilerServices.Extension]
  187. public static double Sum (
  188. IEnumerable<double> source)
  189. {
  190. if (source == null)
  191. throw new ArgumentNullException ();
  192. double sum = 0;
  193. foreach (double element in source)
  194. sum += element;
  195. return sum;
  196. }
  197. [System.Runtime.CompilerServices.Extension]
  198. public static double Sum<T> (
  199. IEnumerable<T> source,
  200. Func<T, double> selector)
  201. {
  202. if (source == null || selector == null)
  203. throw new ArgumentNullException ();
  204. double sum = 0;
  205. foreach (T element in source)
  206. sum += selector (element);
  207. return sum;
  208. }
  209. [System.Runtime.CompilerServices.Extension]
  210. public static double? Sum (
  211. IEnumerable<double?> source)
  212. {
  213. if (source == null)
  214. throw new ArgumentNullException ();
  215. double? sum = 0;
  216. foreach (double? element in source)
  217. if (element.HasValue)
  218. sum += element.Value;
  219. return sum;
  220. }
  221. [System.Runtime.CompilerServices.Extension]
  222. public static double? Sum<T> (
  223. IEnumerable<T> source,
  224. Func<T, double?> selector)
  225. {
  226. if (source == null || selector == null)
  227. throw new ArgumentNullException ();
  228. double? sum = 0;
  229. foreach (T element in source) {
  230. double? item = selector (element);
  231. if (item.HasValue)
  232. sum += item.Value;
  233. }
  234. return sum;
  235. }
  236. [System.Runtime.CompilerServices.Extension]
  237. public static decimal Sum (
  238. IEnumerable<decimal> source)
  239. {
  240. if (source == null)
  241. throw new ArgumentNullException ();
  242. decimal sum = 0;
  243. foreach (decimal element in source)
  244. sum += element;
  245. return sum;
  246. }
  247. [System.Runtime.CompilerServices.Extension]
  248. public static decimal Sum<T> (
  249. IEnumerable<T> source,
  250. Func<T, decimal> selector)
  251. {
  252. if (source == null || selector == null)
  253. throw new ArgumentNullException ();
  254. decimal sum = 0;
  255. foreach (T element in source)
  256. sum += selector (element);
  257. return sum;
  258. }
  259. [System.Runtime.CompilerServices.Extension]
  260. public static decimal? Sum (
  261. IEnumerable<decimal?> source)
  262. {
  263. if (source == null)
  264. throw new ArgumentNullException ();
  265. decimal? sum = 0;
  266. foreach (decimal? element in source)
  267. if (element.HasValue)
  268. sum += element.Value;
  269. return sum;
  270. }
  271. [System.Runtime.CompilerServices.Extension]
  272. public static decimal? Sum<T> (
  273. IEnumerable<T> source,
  274. Func<T, decimal?> selector)
  275. {
  276. if (source == null || selector == null)
  277. throw new ArgumentNullException ();
  278. decimal? sum = 0;
  279. foreach (T element in source) {
  280. decimal? item = selector (element);
  281. if (item.HasValue)
  282. sum += item.Value;
  283. }
  284. return sum;
  285. }
  286. #endregion
  287. #region Min
  288. [System.Runtime.CompilerServices.Extension]
  289. public static int Min (
  290. IEnumerable<int> source)
  291. {
  292. if (source == null)
  293. throw new ArgumentNullException ();
  294. int minimum = int.MaxValue;
  295. int counter = 0;
  296. foreach (int element in source) {
  297. if (element < minimum)
  298. minimum = element;
  299. counter++;
  300. }
  301. if (counter == 0)
  302. throw new InvalidOperationException ();
  303. else
  304. return minimum;
  305. }
  306. [System.Runtime.CompilerServices.Extension]
  307. public static int? Min (
  308. IEnumerable<int?> source)
  309. {
  310. if (source == null)
  311. throw new ArgumentNullException ();
  312. bool onlyNull = true;
  313. int? minimum = int.MaxValue;
  314. foreach (int? element in source) {
  315. if (element.HasValue) {
  316. onlyNull = false;
  317. if (element < minimum)
  318. minimum = element;
  319. }
  320. }
  321. return (onlyNull ? null : minimum);
  322. }
  323. [System.Runtime.CompilerServices.Extension]
  324. public static long Min (
  325. IEnumerable<long> source)
  326. {
  327. if (source == null)
  328. throw new ArgumentNullException ();
  329. long minimum = long.MaxValue;
  330. int counter = 0;
  331. foreach (long element in source) {
  332. if (element < minimum)
  333. minimum = element;
  334. counter++;
  335. }
  336. if (counter == 0)
  337. throw new InvalidOperationException ();
  338. else
  339. return minimum;
  340. }
  341. [System.Runtime.CompilerServices.Extension]
  342. public static long? Min (
  343. IEnumerable<long?> source)
  344. {
  345. if (source == null)
  346. throw new ArgumentNullException ();
  347. bool onlyNull = true;
  348. long? minimum = long.MaxValue;
  349. foreach (long? element in source) {
  350. if (element.HasValue) {
  351. onlyNull = false;
  352. if (element < minimum)
  353. minimum = element;
  354. }
  355. }
  356. return (onlyNull ? null : minimum);
  357. }
  358. [System.Runtime.CompilerServices.Extension]
  359. public static double Min (
  360. IEnumerable<double> source)
  361. {
  362. if (source == null)
  363. throw new ArgumentNullException ();
  364. double minimum = double.MaxValue;
  365. int counter = 0;
  366. foreach (double element in source) {
  367. if (element < minimum)
  368. minimum = element;
  369. counter++;
  370. }
  371. if (counter == 0)
  372. throw new InvalidOperationException ();
  373. else
  374. return minimum;
  375. }
  376. [System.Runtime.CompilerServices.Extension]
  377. public static double? Min (
  378. IEnumerable<double?> source)
  379. {
  380. if (source == null)
  381. throw new ArgumentNullException ();
  382. bool onlyNull = true;
  383. double? minimum = double.MaxValue;
  384. foreach (double? element in source) {
  385. if (element.HasValue) {
  386. onlyNull = false;
  387. if (element < minimum)
  388. minimum = element;
  389. }
  390. }
  391. return (onlyNull ? null : minimum);
  392. }
  393. [System.Runtime.CompilerServices.Extension]
  394. public static decimal Min (
  395. IEnumerable<decimal> source)
  396. {
  397. if (source == null)
  398. throw new ArgumentNullException ();
  399. decimal minimum = decimal.MaxValue;
  400. int counter = 0;
  401. foreach (decimal element in source) {
  402. if (element < minimum)
  403. minimum = element;
  404. counter++;
  405. }
  406. if (counter == 0)
  407. throw new InvalidOperationException ();
  408. else
  409. return minimum;
  410. }
  411. [System.Runtime.CompilerServices.Extension]
  412. public static decimal? Min (
  413. IEnumerable<decimal?> source)
  414. {
  415. if (source == null)
  416. throw new ArgumentNullException ();
  417. bool onlyNull = true;
  418. decimal? minimum = decimal.MaxValue;
  419. foreach (decimal? element in source) {
  420. if (element.HasValue) {
  421. onlyNull = false;
  422. if (element < minimum)
  423. minimum = element;
  424. }
  425. }
  426. return (onlyNull ? null : minimum);
  427. }
  428. [System.Runtime.CompilerServices.Extension]
  429. public static T Min<T> (
  430. IEnumerable<T> source)
  431. {
  432. if (source == null)
  433. throw new ArgumentNullException ();
  434. bool notAssigned = true;
  435. T minimum = default (T);
  436. int counter = 0;
  437. foreach (T element in source) {
  438. if (notAssigned) {
  439. minimum = element;
  440. notAssigned = false;
  441. }
  442. else {
  443. int comparison;
  444. if (element is IComparable<T>)
  445. comparison = ((IComparable<T>)element).CompareTo (minimum);
  446. else if (element is System.IComparable)
  447. comparison = ((System.IComparable)element).CompareTo (minimum);
  448. else
  449. throw new ArgumentNullException();
  450. if (comparison < 0)
  451. minimum = element;
  452. }
  453. counter++;
  454. }
  455. if (counter == 0)
  456. throw new InvalidOperationException ();
  457. else
  458. return minimum;
  459. }
  460. [System.Runtime.CompilerServices.Extension]
  461. public static int Min<T> (
  462. IEnumerable<T> source,
  463. Func<T, int> selector)
  464. {
  465. if (source == null || selector == null)
  466. throw new ArgumentNullException ();
  467. int minimum = int.MaxValue;
  468. int counter = 0;
  469. foreach (T item in source) {
  470. int element = selector (item);
  471. if (element < minimum)
  472. minimum = element;
  473. counter++;
  474. }
  475. if (counter == 0)
  476. throw new InvalidOperationException ();
  477. else
  478. return minimum;
  479. }
  480. [System.Runtime.CompilerServices.Extension]
  481. public static int? Min<T> (
  482. IEnumerable<T> source,
  483. Func<T, int?> selector)
  484. {
  485. if (source == null || selector == null)
  486. throw new ArgumentNullException ();
  487. bool onlyNull = true;
  488. int? minimum = int.MaxValue;
  489. foreach (T item in source) {
  490. int? element = selector (item);
  491. if (element.HasValue) {
  492. onlyNull = false;
  493. if (element < minimum)
  494. minimum = element;
  495. }
  496. }
  497. return (onlyNull ? null : minimum);
  498. }
  499. [System.Runtime.CompilerServices.Extension]
  500. public static long Min<T> (
  501. IEnumerable<T> source,
  502. Func<T, long> selector)
  503. {
  504. if (source == null || selector == null)
  505. throw new ArgumentNullException ();
  506. long minimum = long.MaxValue;
  507. int counter = 0;
  508. foreach (T item in source) {
  509. long element = selector (item);
  510. if (element < minimum)
  511. minimum = element;
  512. counter++;
  513. }
  514. if (counter == 0)
  515. throw new InvalidOperationException ();
  516. else
  517. return minimum;
  518. }
  519. [System.Runtime.CompilerServices.Extension]
  520. public static long? Min<T> (
  521. IEnumerable<T> source,
  522. Func<T, long?> selector)
  523. {
  524. if (source == null || selector == null)
  525. throw new ArgumentNullException ();
  526. bool onlyNull = true;
  527. long? minimum = long.MaxValue;
  528. foreach (T item in source) {
  529. long? element = selector (item);
  530. if (element.HasValue) {
  531. onlyNull = false;
  532. if (element < minimum)
  533. minimum = element;
  534. }
  535. }
  536. return (onlyNull ? null : minimum);
  537. }
  538. [System.Runtime.CompilerServices.Extension]
  539. public static double Min<T> (
  540. IEnumerable<T> source,
  541. Func<T, double> selector)
  542. {
  543. if (source == null || selector == null)
  544. throw new ArgumentNullException ();
  545. double minimum = double.MaxValue;
  546. int counter = 0;
  547. foreach (T item in source)
  548. {
  549. double element = selector (item);
  550. if (element < minimum)
  551. minimum = element;
  552. counter++;
  553. }
  554. if (counter == 0)
  555. throw new InvalidOperationException ();
  556. else
  557. return minimum;
  558. }
  559. [System.Runtime.CompilerServices.Extension]
  560. public static double? Min<T> (
  561. IEnumerable<T> source,
  562. Func<T, double?> selector)
  563. {
  564. if (source == null || selector == null)
  565. throw new ArgumentNullException ();
  566. bool onlyNull = true;
  567. double? minimum = double.MaxValue;
  568. foreach (T item in source) {
  569. double? element = selector (item);
  570. if (element.HasValue) {
  571. onlyNull = false;
  572. if (element < minimum)
  573. minimum = element;
  574. }
  575. }
  576. return (onlyNull ? null : minimum);
  577. }
  578. [System.Runtime.CompilerServices.Extension]
  579. public static decimal Min<T> (
  580. IEnumerable<T> source,
  581. Func<T, decimal> selector)
  582. {
  583. if (source == null || selector == null)
  584. throw new ArgumentNullException ();
  585. decimal minimum = decimal.MaxValue;
  586. int counter = 0;
  587. foreach (T item in source) {
  588. decimal element = selector (item);
  589. if (element < minimum)
  590. minimum = element;
  591. counter++;
  592. }
  593. if (counter == 0)
  594. throw new InvalidOperationException ();
  595. else
  596. return minimum;
  597. }
  598. [System.Runtime.CompilerServices.Extension]
  599. public static decimal? Min<T> (
  600. IEnumerable<T> source,
  601. Func<T, decimal?> selector)
  602. {
  603. if (source == null || selector == null)
  604. throw new ArgumentNullException ();
  605. bool onlyNull = true;
  606. decimal? minimum = decimal.MaxValue;
  607. foreach (T item in source) {
  608. decimal? element = selector (item);
  609. if (element.HasValue) {
  610. onlyNull = false;
  611. if (element < minimum)
  612. minimum = element;
  613. }
  614. }
  615. return (onlyNull ? null : minimum);
  616. }
  617. [System.Runtime.CompilerServices.Extension]
  618. public static S Min<T, S> (
  619. IEnumerable<T> source,
  620. Func<T, S> selector)
  621. {
  622. if (source == null || selector == null)
  623. throw new ArgumentNullException ();
  624. bool notAssigned = true;
  625. S minimum = default (S);
  626. int counter = 0;
  627. foreach (T item in source) {
  628. S element = selector (item);
  629. if (notAssigned) {
  630. minimum = element;
  631. notAssigned = false;
  632. }
  633. else {
  634. int comparison;
  635. if (element is IComparable<S>)
  636. comparison = ((IComparable<S>)element).CompareTo (minimum);
  637. else if (element is System.IComparable)
  638. comparison = ((System.IComparable)element).CompareTo (minimum);
  639. else
  640. throw new ArgumentNullException ();
  641. if (comparison < 0)
  642. minimum = element;
  643. }
  644. counter++;
  645. }
  646. if (counter == 0)
  647. throw new InvalidOperationException ();
  648. else
  649. return minimum;
  650. }
  651. #endregion
  652. #region Max
  653. [System.Runtime.CompilerServices.Extension]
  654. public static int Max (
  655. IEnumerable<int> source)
  656. {
  657. if (source == null)
  658. throw new ArgumentNullException ();
  659. int maximum = int.MinValue;
  660. int counter = 0;
  661. foreach (int element in source) {
  662. if (element > maximum)
  663. maximum = element;
  664. counter++;
  665. }
  666. if (counter == 0)
  667. throw new InvalidOperationException ();
  668. else
  669. return maximum;
  670. }
  671. [System.Runtime.CompilerServices.Extension]
  672. public static int? Max (
  673. IEnumerable<int?> source)
  674. {
  675. if (source == null)
  676. throw new ArgumentNullException ();
  677. bool onlyNull = true;
  678. int? maximum = int.MinValue;
  679. foreach (int? element in source) {
  680. if (element.HasValue) {
  681. onlyNull = false;
  682. if (element > maximum)
  683. maximum = element;
  684. }
  685. }
  686. return (onlyNull ? null : maximum);
  687. }
  688. [System.Runtime.CompilerServices.Extension]
  689. public static long Max (
  690. IEnumerable<long> source)
  691. {
  692. if (source == null)
  693. throw new ArgumentNullException ();
  694. long maximum = long.MinValue;
  695. int counter = 0;
  696. foreach (long element in source) {
  697. if (element > maximum)
  698. maximum = element;
  699. counter++;
  700. }
  701. if (counter == 0)
  702. throw new InvalidOperationException ();
  703. else
  704. return maximum;
  705. }
  706. [System.Runtime.CompilerServices.Extension]
  707. public static long? Max (
  708. IEnumerable<long?> source)
  709. {
  710. if (source == null)
  711. throw new ArgumentNullException ();
  712. bool onlyNull = true;
  713. long? maximum = long.MinValue;
  714. foreach (long? element in source) {
  715. if (element.HasValue) {
  716. onlyNull = false;
  717. if (element > maximum)
  718. maximum = element;
  719. }
  720. }
  721. return (onlyNull ? null : maximum);
  722. }
  723. [System.Runtime.CompilerServices.Extension]
  724. public static double Max (
  725. IEnumerable<double> source)
  726. {
  727. if (source == null)
  728. throw new ArgumentNullException ();
  729. double maximum = double.MinValue;
  730. int counter = 0;
  731. foreach (double element in source) {
  732. if (element > maximum)
  733. maximum = element;
  734. counter++;
  735. }
  736. if (counter == 0)
  737. throw new InvalidOperationException ();
  738. else
  739. return maximum;
  740. }
  741. [System.Runtime.CompilerServices.Extension]
  742. public static double? Max (
  743. IEnumerable<double?> source)
  744. {
  745. if (source == null)
  746. throw new ArgumentNullException ();
  747. bool onlyNull = true;
  748. double? maximum = double.MinValue;
  749. foreach (double? element in source) {
  750. if (element.HasValue) {
  751. onlyNull = false;
  752. if (element > maximum)
  753. maximum = element;
  754. }
  755. }
  756. return (onlyNull ? null : maximum);
  757. }
  758. [System.Runtime.CompilerServices.Extension]
  759. public static decimal Max (
  760. IEnumerable<decimal> source)
  761. {
  762. if (source == null)
  763. throw new ArgumentNullException ();
  764. decimal maximum = decimal.MinValue;
  765. int counter = 0;
  766. foreach (decimal element in source) {
  767. if (element > maximum)
  768. maximum = element;
  769. counter++;
  770. }
  771. if (counter == 0)
  772. throw new InvalidOperationException ();
  773. else
  774. return maximum;
  775. }
  776. [System.Runtime.CompilerServices.Extension]
  777. public static decimal? Max (
  778. IEnumerable<decimal?> source)
  779. {
  780. if (source == null)
  781. throw new ArgumentNullException ();
  782. bool onlyNull = true;
  783. decimal? maximum = decimal.MinValue;
  784. foreach (decimal? element in source) {
  785. if (element.HasValue) {
  786. onlyNull = false;
  787. if (element > maximum)
  788. maximum = element;
  789. }
  790. }
  791. return (onlyNull ? null : maximum);
  792. }
  793. [System.Runtime.CompilerServices.Extension]
  794. public static T Max<T> (
  795. IEnumerable<T> source)
  796. {
  797. if (source == null)
  798. throw new ArgumentNullException ();
  799. bool notAssigned = true;
  800. T maximum = default (T);
  801. int counter = 0;
  802. foreach (T element in source) {
  803. if (notAssigned) {
  804. maximum = element;
  805. notAssigned = false;
  806. }
  807. else {
  808. int comparison;
  809. if (element is IComparable<T>)
  810. comparison = ((IComparable<T>)element).CompareTo (maximum);
  811. else if (element is System.IComparable)
  812. comparison = ((System.IComparable)element).CompareTo (maximum);
  813. else
  814. throw new ArgumentNullException();
  815. if (comparison > 0)
  816. maximum = element;
  817. }
  818. counter++;
  819. }
  820. if (counter == 0)
  821. throw new InvalidOperationException ();
  822. else
  823. return maximum;
  824. }
  825. [System.Runtime.CompilerServices.Extension]
  826. public static int Max<T> (
  827. IEnumerable<T> source,
  828. Func<T, int> selector)
  829. {
  830. if (source == null || selector == null)
  831. throw new ArgumentNullException ();
  832. int maximum = int.MinValue;
  833. int counter = 0;
  834. foreach (T item in source)
  835. {
  836. int element = selector (item);
  837. if (element > maximum)
  838. maximum = element;
  839. counter++;
  840. }
  841. if (counter == 0)
  842. throw new InvalidOperationException ();
  843. else
  844. return maximum;
  845. }
  846. [System.Runtime.CompilerServices.Extension]
  847. public static int? Max<T> (
  848. IEnumerable<T> source,
  849. Func<T, int?> selector)
  850. {
  851. if (source == null || selector == null)
  852. throw new ArgumentNullException ();
  853. bool onlyNull = true;
  854. int? maximum = int.MinValue;
  855. foreach (T item in source) {
  856. int? element = selector (item);
  857. if (element.HasValue) {
  858. onlyNull = false;
  859. if (element > maximum)
  860. maximum = element;
  861. }
  862. }
  863. return (onlyNull ? null : maximum);
  864. }
  865. [System.Runtime.CompilerServices.Extension]
  866. public static long Max<T> (
  867. IEnumerable<T> source,
  868. Func<T, long> selector)
  869. {
  870. if (source == null || selector == null)
  871. throw new ArgumentNullException ();
  872. long maximum = long.MinValue;
  873. int counter = 0;
  874. foreach (T item in source) {
  875. long element = selector (item);
  876. if (element > maximum)
  877. maximum = element;
  878. counter++;
  879. }
  880. if (counter == 0)
  881. throw new InvalidOperationException ();
  882. else
  883. return maximum;
  884. }
  885. [System.Runtime.CompilerServices.Extension]
  886. public static long? Max<T> (
  887. IEnumerable<T> source,
  888. Func<T, long?> selector)
  889. {
  890. if (source == null || selector == null)
  891. throw new ArgumentNullException ();
  892. bool onlyNull = true;
  893. long? maximum = long.MinValue;
  894. foreach (T item in source) {
  895. long? element = selector (item);
  896. if (element.HasValue) {
  897. onlyNull = false;
  898. if (element > maximum)
  899. maximum = element;
  900. }
  901. }
  902. return (onlyNull ? null : maximum);
  903. }
  904. [System.Runtime.CompilerServices.Extension]
  905. public static double Max<T> (
  906. IEnumerable<T> source,
  907. Func<T, double> selector)
  908. {
  909. if (source == null || selector == null)
  910. throw new ArgumentNullException ();
  911. double maximum = double.MinValue;
  912. int counter = 0;
  913. foreach (T item in source) {
  914. double element = selector (item);
  915. if (element > maximum)
  916. maximum = element;
  917. counter++;
  918. }
  919. if (counter == 0)
  920. throw new InvalidOperationException ();
  921. else
  922. return maximum;
  923. }
  924. [System.Runtime.CompilerServices.Extension]
  925. public static double? Max<T> (
  926. IEnumerable<T> source,
  927. Func<T, double?> selector)
  928. {
  929. if (source == null || selector == null)
  930. throw new ArgumentNullException ();
  931. bool onlyNull = true;
  932. double? maximum = double.MinValue;
  933. foreach (T item in source) {
  934. double? element = selector(item);
  935. if (element.HasValue) {
  936. onlyNull = false;
  937. if (element > maximum)
  938. maximum = element;
  939. }
  940. }
  941. return (onlyNull ? null : maximum);
  942. }
  943. [System.Runtime.CompilerServices.Extension]
  944. public static decimal Max<T> (
  945. IEnumerable<T> source,
  946. Func<T, decimal> selector)
  947. {
  948. if (source == null || selector == null)
  949. throw new ArgumentNullException ();
  950. decimal maximum = decimal.MinValue;
  951. int counter = 0;
  952. foreach (T item in source) {
  953. decimal element = selector(item);
  954. if (element > maximum)
  955. maximum = element;
  956. counter++;
  957. }
  958. if (counter == 0)
  959. throw new InvalidOperationException ();
  960. else
  961. return maximum;
  962. }
  963. [System.Runtime.CompilerServices.Extension]
  964. public static decimal? Max<T> (
  965. IEnumerable<T> source,
  966. Func<T, decimal?> selector)
  967. {
  968. if (source == null || selector == null)
  969. throw new ArgumentNullException ();
  970. bool onlyNull = true;
  971. decimal? maximum = decimal.MinValue;
  972. foreach (T item in source) {
  973. decimal? element = selector(item);
  974. if (element.HasValue) {
  975. onlyNull = false;
  976. if (element > maximum)
  977. maximum = element;
  978. }
  979. }
  980. return (onlyNull ? null : maximum);
  981. }
  982. [System.Runtime.CompilerServices.Extension]
  983. public static S Max<T, S> (
  984. IEnumerable<T> source,
  985. Func<T, S> selector)
  986. {
  987. if (source == null || selector == null)
  988. throw new ArgumentNullException ();
  989. bool notAssigned = true;
  990. S maximum = default (S);
  991. int counter = 0;
  992. foreach (T item in source)
  993. {
  994. S element = selector (item);
  995. if (notAssigned) {
  996. maximum = element;
  997. notAssigned = false;
  998. }
  999. else {
  1000. int comparison;
  1001. if (element is IComparable<S>)
  1002. comparison = ((IComparable<S>)element).CompareTo (maximum);
  1003. else if (element is System.IComparable)
  1004. comparison = ((System.IComparable)element).CompareTo (maximum);
  1005. else
  1006. throw new ArgumentNullException();
  1007. if (comparison > 0)
  1008. maximum = element;
  1009. }
  1010. counter++;
  1011. }
  1012. if (counter == 0)
  1013. throw new InvalidOperationException ();
  1014. else
  1015. return maximum;
  1016. }
  1017. #endregion
  1018. #region Average
  1019. [System.Runtime.CompilerServices.Extension]
  1020. public static double Average (
  1021. IEnumerable<int> source)
  1022. {
  1023. if (source == null)
  1024. throw new ArgumentNullException ();
  1025. long sum = 0;
  1026. long counter = 0;
  1027. foreach (int element in source) {
  1028. sum += element;
  1029. counter++;
  1030. }
  1031. if (counter == 0)
  1032. throw new InvalidOperationException ();
  1033. else
  1034. return (double)sum / (double)counter;
  1035. }
  1036. [System.Runtime.CompilerServices.Extension]
  1037. public static double? Average (
  1038. IEnumerable<int?> source)
  1039. {
  1040. if (source == null)
  1041. throw new ArgumentNullException ();
  1042. bool onlyNull = true;
  1043. long sum = 0;
  1044. long counter = 0;
  1045. foreach (int? element in source) {
  1046. if (element.HasValue) {
  1047. onlyNull = false;
  1048. sum += element.Value;
  1049. counter++;
  1050. }
  1051. }
  1052. return (onlyNull ? null : (double?)sum / (double?)counter);
  1053. }
  1054. [System.Runtime.CompilerServices.Extension]
  1055. public static double Average (
  1056. IEnumerable<long> source)
  1057. {
  1058. if (source == null)
  1059. throw new ArgumentNullException ();
  1060. long sum = 0;
  1061. long counter = 0;
  1062. foreach (long element in source) {
  1063. sum += element;
  1064. counter++;
  1065. }
  1066. if (counter == 0)
  1067. throw new InvalidOperationException ();
  1068. else
  1069. return (double)sum / (double)counter;
  1070. }
  1071. [System.Runtime.CompilerServices.Extension]
  1072. public static double? Average (
  1073. IEnumerable<long?> source)
  1074. {
  1075. if (source == null)
  1076. throw new ArgumentNullException ();
  1077. bool onlyNull = true;
  1078. long sum = 0;
  1079. long counter = 0;
  1080. foreach (long? element in source) {
  1081. if (element.HasValue) {
  1082. onlyNull = false;
  1083. sum += element.Value;
  1084. counter++;
  1085. }
  1086. }
  1087. return (onlyNull ? null : (double?)sum / (double?)counter);
  1088. }
  1089. [System.Runtime.CompilerServices.Extension]
  1090. public static double Average (
  1091. IEnumerable<double> source)
  1092. {
  1093. if (source == null)
  1094. throw new ArgumentNullException ();
  1095. double sum = 0;
  1096. double counter = 0;
  1097. foreach (double element in source) {
  1098. sum += element;
  1099. counter++;
  1100. }
  1101. if (counter == 0)
  1102. throw new InvalidOperationException ();
  1103. else
  1104. return sum / counter;
  1105. }
  1106. [System.Runtime.CompilerServices.Extension]
  1107. public static double? Average (
  1108. IEnumerable<double?> source)
  1109. {
  1110. if (source == null)
  1111. throw new ArgumentNullException ();
  1112. bool onlyNull = true;
  1113. double sum = 0;
  1114. double counter = 0;
  1115. foreach (double? element in source) {
  1116. if (element.HasValue) {
  1117. onlyNull = false;
  1118. sum += element.Value;
  1119. counter++;
  1120. }
  1121. }
  1122. return (onlyNull ? null : (double?)(sum / counter));
  1123. }
  1124. [System.Runtime.CompilerServices.Extension]
  1125. public static decimal Average (
  1126. IEnumerable<decimal> source)
  1127. {
  1128. if (source == null)
  1129. throw new ArgumentNullException ();
  1130. decimal sum = 0;
  1131. decimal counter = 0;
  1132. foreach (decimal element in source) {
  1133. sum += element;
  1134. counter++;
  1135. }
  1136. if (counter == 0)
  1137. throw new InvalidOperationException ();
  1138. else
  1139. return sum / counter;
  1140. }
  1141. [System.Runtime.CompilerServices.Extension]
  1142. public static decimal? Average (
  1143. IEnumerable<decimal?> source)
  1144. {
  1145. if (source == null)
  1146. throw new ArgumentNullException ();
  1147. bool onlyNull = true;
  1148. decimal sum = 0;
  1149. decimal counter = 0;
  1150. foreach (decimal? element in source) {
  1151. if (element.HasValue) {
  1152. onlyNull = false;
  1153. sum += element.Value;
  1154. counter++;
  1155. }
  1156. }
  1157. return (onlyNull ? null : (decimal?)(sum / counter));
  1158. }
  1159. [System.Runtime.CompilerServices.Extension]
  1160. public static double Average<T> (
  1161. IEnumerable<T> source,
  1162. Func<T, int> selector)
  1163. {
  1164. if (source == null || selector == null)
  1165. throw new ArgumentNullException ();
  1166. long sum = 0;
  1167. long counter = 0;
  1168. foreach (T item in source) {
  1169. sum += selector (item);
  1170. counter++;
  1171. }
  1172. if (counter == 0)
  1173. throw new InvalidOperationException ();
  1174. else
  1175. return (double)sum / (double)counter;
  1176. }
  1177. [System.Runtime.CompilerServices.Extension]
  1178. public static double? Average<T> (
  1179. IEnumerable<T> source,
  1180. Func<T, int?> selector)
  1181. {
  1182. if (source == null || selector == null)
  1183. throw new ArgumentNullException ();
  1184. bool onlyNull = true;
  1185. long sum = 0;
  1186. long counter = 0;
  1187. foreach (T item in source) {
  1188. int? element = selector (item);
  1189. if (element.HasValue) {
  1190. onlyNull = false;
  1191. sum += element.Value;
  1192. counter++;
  1193. }
  1194. }
  1195. return (onlyNull ? null : (double?)sum / (double?)counter);
  1196. }
  1197. [System.Runtime.CompilerServices.Extension]
  1198. public static double Average<T> (
  1199. IEnumerable<T> source,
  1200. Func<T, long> selector)
  1201. {
  1202. if (source == null || selector == null)
  1203. throw new ArgumentNullException ();
  1204. long sum = 0;
  1205. long counter = 0;
  1206. foreach (T item in source) {
  1207. sum += selector (item);
  1208. counter++;
  1209. }
  1210. if (counter == 0)
  1211. throw new InvalidOperationException();
  1212. else
  1213. return (double)sum / (double)counter;
  1214. }
  1215. [System.Runtime.CompilerServices.Extension]
  1216. public static double? Average<T> (
  1217. IEnumerable<T> source,
  1218. Func<T, long?> selector)
  1219. {
  1220. if (source == null || selector == null)
  1221. throw new ArgumentNullException ();
  1222. bool onlyNull = true;
  1223. long sum = 0;
  1224. long counter = 0;
  1225. foreach (T item in source) {
  1226. long? element = selector (item);
  1227. if (element.HasValue) {
  1228. onlyNull = false;
  1229. sum += element.Value;
  1230. counter++;
  1231. }
  1232. }
  1233. return (onlyNull ? null : (double?)sum/(double?)counter);
  1234. }
  1235. [System.Runtime.CompilerServices.Extension]
  1236. public static double Average<T> (
  1237. IEnumerable<T> source,
  1238. Func<T, double> selector)
  1239. {
  1240. if (source == null || selector == null)
  1241. throw new ArgumentNullException ();
  1242. double sum = 0;
  1243. double counter = 0;
  1244. foreach (T item in source) {
  1245. sum += selector (item);
  1246. counter++;
  1247. }
  1248. if (counter == 0)
  1249. throw new InvalidOperationException ();
  1250. else
  1251. return sum / counter;
  1252. }
  1253. [System.Runtime.CompilerServices.Extension]
  1254. public static double? Average<T> (
  1255. IEnumerable<T> source,
  1256. Func<T, double?> selector)
  1257. {
  1258. if (source == null || selector == null)
  1259. throw new ArgumentNullException ();
  1260. bool onlyNull = true;
  1261. double sum = 0;
  1262. double counter = 0;
  1263. foreach (T item in source) {
  1264. double? element = selector (item);
  1265. if (element.HasValue) {
  1266. onlyNull = false;
  1267. sum += element.Value;
  1268. counter++;
  1269. }
  1270. }
  1271. return (onlyNull ? null : (double?)(sum/counter));
  1272. }
  1273. [System.Runtime.CompilerServices.Extension]
  1274. public static decimal Average<T> (
  1275. IEnumerable<T> source,
  1276. Func<T, decimal> selector)
  1277. {
  1278. if (source == null || selector == null)
  1279. throw new ArgumentNullException ();
  1280. decimal sum = 0;
  1281. decimal counter = 0;
  1282. foreach (T item in source) {
  1283. sum += selector(item);
  1284. counter++;
  1285. }
  1286. if (counter == 0)
  1287. throw new InvalidOperationException ();
  1288. else
  1289. return sum / counter;
  1290. }
  1291. [System.Runtime.CompilerServices.Extension]
  1292. public static decimal? Average<T> (
  1293. IEnumerable<T> source,
  1294. Func<T, decimal?> selector)
  1295. {
  1296. if (source == null || selector == null)
  1297. throw new ArgumentNullException ();
  1298. bool onlyNull = true;
  1299. decimal sum = 0;
  1300. decimal counter = 0;
  1301. foreach (T item in source) {
  1302. decimal? element = selector (item);
  1303. if (element.HasValue) {
  1304. onlyNull = false;
  1305. sum += element.Value;
  1306. counter++;
  1307. }
  1308. }
  1309. return (onlyNull ? null : (decimal?)(sum/counter));
  1310. }
  1311. #endregion
  1312. #region Fold
  1313. [Obsolete ("Use Aggregate instead")]
  1314. [System.Runtime.CompilerServices.Extension]
  1315. public static T Fold<T> (
  1316. IEnumerable<T> source,
  1317. Func<T, T, T> func)
  1318. {
  1319. return Fold<T> (source, func);
  1320. }
  1321. [Obsolete ("Use Aggregate instead")]
  1322. [System.Runtime.CompilerServices.Extension]
  1323. public static U Fold<T, U> (
  1324. IEnumerable<T> source,
  1325. U seed,
  1326. Func<U, T, U> func)
  1327. {
  1328. return Fold<T, U> (source, seed, func);
  1329. }
  1330. #endregion
  1331. #region Aggregate
  1332. [System.Runtime.CompilerServices.Extension]
  1333. public static T Aggregate<T> (
  1334. IEnumerable<T> source,
  1335. Func<T, T, T> func)
  1336. {
  1337. if (source == null || func == null)
  1338. throw new ArgumentNullException ();
  1339. int counter = 0;
  1340. T folded = default (T);
  1341. foreach (T element in source) {
  1342. if (counter == 0)
  1343. folded = element;
  1344. else
  1345. folded = func (folded, element);
  1346. }
  1347. if (counter == 0)
  1348. throw new InvalidOperationException ();
  1349. else
  1350. return folded;
  1351. }
  1352. [System.Runtime.CompilerServices.Extension]
  1353. public static U Aggregate<T, U> (
  1354. IEnumerable<T> source,
  1355. U seed,
  1356. Func<U, T, U> func)
  1357. {
  1358. if (source == null || func == null)
  1359. throw new ArgumentNullException ();
  1360. U folded = seed;
  1361. foreach (T element in source)
  1362. folded = func (folded, element);
  1363. return folded;
  1364. }
  1365. #endregion
  1366. #region Concat
  1367. [System.Runtime.CompilerServices.Extension]
  1368. public static IEnumerable<T> Concat<T> (
  1369. IEnumerable<T> first,
  1370. IEnumerable<T> second)
  1371. {
  1372. if (first == null || second == null)
  1373. throw new ArgumentNullException ();
  1374. foreach (T element in first)
  1375. yield return element;
  1376. foreach (T element in second)
  1377. yield return element;
  1378. }
  1379. #endregion
  1380. #region ToSequence
  1381. [System.Runtime.CompilerServices.Extension]
  1382. public static IEnumerable<T> ToSequence<T> (
  1383. IEnumerable<T> source)
  1384. {
  1385. return (IEnumerable<T>)source;
  1386. }
  1387. #endregion
  1388. #region ToArray
  1389. [System.Runtime.CompilerServices.Extension]
  1390. public static T[] ToArray<T> (
  1391. IEnumerable<T> source)
  1392. {
  1393. if (source == null)
  1394. throw new ArgumentNullException ();
  1395. List<T> list = new List<T> (source);
  1396. return list.ToArray ();
  1397. }
  1398. #endregion
  1399. #region ToList
  1400. [System.Runtime.CompilerServices.Extension]
  1401. public static List<T> ToList<T> (
  1402. IEnumerable<T> source)
  1403. {
  1404. if (source == null)
  1405. throw new ArgumentNullException ();
  1406. return new List<T> (source);
  1407. }
  1408. #endregion
  1409. #region ToDictionary
  1410. [System.Runtime.CompilerServices.Extension]
  1411. public static Dictionary<K, T> ToDictionary<T, K> (
  1412. IEnumerable<T> source,
  1413. Func<T, K> keySelector)
  1414. {
  1415. return ToDictionary<T, K> (source, keySelector, null);
  1416. }
  1417. [System.Runtime.CompilerServices.Extension]
  1418. public static Dictionary<K, T> ToDictionary<T, K> (
  1419. IEnumerable<T> source,
  1420. Func<T, K> keySelector,
  1421. IEqualityComparer<K> comparer)
  1422. {
  1423. if (source == null || keySelector == null)
  1424. throw new ArgumentNullException ();
  1425. Dictionary<K, T> dictionary = new Dictionary<K, T> (comparer ?? EqualityComparer<K>.Default);
  1426. foreach (T element in source) {
  1427. K key = keySelector (element);
  1428. if (key == null)
  1429. throw new ArgumentNullException ();
  1430. else if (dictionary.ContainsKey (key))
  1431. throw new ArgumentException ();
  1432. else
  1433. dictionary.Add (key, element);
  1434. }
  1435. return dictionary;
  1436. }
  1437. [System.Runtime.CompilerServices.Extension]
  1438. public static Dictionary<K, E> ToDictionary<T, K, E> (
  1439. IEnumerable<T> source,
  1440. Func<T, K> keySelector,
  1441. Func<T, E> elementSelector)
  1442. {
  1443. return ToDictionary<T, K, E> (source, keySelector, elementSelector, null);
  1444. }
  1445. [System.Runtime.CompilerServices.Extension]
  1446. public static Dictionary<K, E> ToDictionary<T, K, E> (
  1447. IEnumerable<T> source,
  1448. Func<T, K> keySelector,
  1449. Func<T, E> elementSelector,
  1450. IEqualityComparer<K> comparer)
  1451. {
  1452. if (source == null || keySelector == null || elementSelector == null)
  1453. throw new ArgumentNullException ();
  1454. Dictionary<K, E> dictionary = new Dictionary<K, E>(comparer ?? EqualityComparer<K>.Default);
  1455. foreach (T element in source)
  1456. {
  1457. K key = keySelector (element);
  1458. if (key == null)
  1459. throw new ArgumentNullException ();
  1460. else if (dictionary.ContainsKey (key))
  1461. throw new ArgumentException ();
  1462. else
  1463. dictionary.Add(key, elementSelector (element));
  1464. }
  1465. return dictionary;
  1466. }
  1467. #endregion
  1468. #region ToLookup
  1469. [System.Runtime.CompilerServices.Extension]
  1470. public static Lookup<K, T> ToLookup<T, K> (
  1471. IEnumerable<T> source,
  1472. Func<T, K> keySelector)
  1473. {
  1474. return ToLookup<T, K> (source, keySelector, null);
  1475. }
  1476. [System.Runtime.CompilerServices.Extension]
  1477. public static Lookup<K, T> ToLookup<T, K> (
  1478. IEnumerable<T> source,
  1479. Func<T, K> keySelector,
  1480. IEqualityComparer<K> comparer)
  1481. {
  1482. if (source == null || keySelector == null)
  1483. throw new ArgumentNullException ();
  1484. Dictionary<K, List<T>> dictionary = new Dictionary<K, List<T>> (comparer ?? EqualityComparer<K>.Default);
  1485. foreach (T element in source) {
  1486. K key = keySelector (element);
  1487. if (key == null)
  1488. throw new ArgumentNullException ();
  1489. if (!dictionary.ContainsKey (key))
  1490. dictionary.Add (key, new List<T> ());
  1491. dictionary[key].Add (element);
  1492. }
  1493. return new Lookup<K, T> (dictionary);
  1494. }
  1495. [System.Runtime.CompilerServices.Extension]
  1496. public static Lookup<K, E> ToLookup<T, K, E> (
  1497. IEnumerable<T> source,
  1498. Func<T, K> keySelector,
  1499. Func<T, E> elementSelector)
  1500. {
  1501. return ToLookup<T, K, E> (source, keySelector, elementSelector, null);
  1502. }
  1503. [System.Runtime.CompilerServices.Extension]
  1504. public static Lookup<K, E> ToLookup<T, K, E> (
  1505. IEnumerable<T> source,
  1506. Func<T, K> keySelector,
  1507. Func<T, E> elementSelector,
  1508. IEqualityComparer<K> comparer)
  1509. {
  1510. if (source == null || keySelector == null || elementSelector == null)
  1511. throw new ArgumentNullException ();
  1512. Dictionary<K, List<E>> dictionary = new Dictionary<K, List<E>>(comparer ?? EqualityComparer<K>.Default);
  1513. foreach (T element in source)
  1514. {
  1515. K key = keySelector (element);
  1516. if (key == null)
  1517. throw new ArgumentNullException ();
  1518. if (!dictionary.ContainsKey (key))
  1519. dictionary.Add (key, new List<E> ());
  1520. dictionary[key].Add (elementSelector (element));
  1521. }
  1522. return new Lookup<K, E> (dictionary);
  1523. }
  1524. #endregion
  1525. #region OfType
  1526. [System.Runtime.CompilerServices.Extension]
  1527. public static IEnumerable<T> OfType<T> (
  1528. System.Collections.IEnumerable source)
  1529. {
  1530. if (source == null)
  1531. throw new ArgumentNullException ();
  1532. foreach (object element in source)
  1533. if (element is T)
  1534. yield return (T)element;
  1535. }
  1536. #endregion
  1537. #region Cast
  1538. [System.Runtime.CompilerServices.Extension]
  1539. public static IEnumerable<T> Cast<T> (
  1540. System.Collections.IEnumerable source)
  1541. {
  1542. if (source == null)
  1543. throw new ArgumentNullException ();
  1544. foreach (object element in source)
  1545. yield return (T)element;
  1546. }
  1547. #endregion
  1548. #region First
  1549. [System.Runtime.CompilerServices.Extension]
  1550. public static T First<T> (
  1551. IEnumerable<T> source)
  1552. {
  1553. if (source == null)
  1554. throw new ArgumentNullException ();
  1555. foreach (T element in source)
  1556. return element;
  1557. throw new InvalidOperationException ();
  1558. }
  1559. [System.Runtime.CompilerServices.Extension]
  1560. public static T First<T> (
  1561. IEnumerable<T> source,
  1562. Func<T, bool> predicate)
  1563. {
  1564. if (source == null || predicate == null)
  1565. throw new ArgumentNullException ();
  1566. foreach (T element in source) {
  1567. if (predicate (element))
  1568. return element;
  1569. }
  1570. throw new InvalidOperationException ();
  1571. }
  1572. #endregion
  1573. #region FirstOrDefault
  1574. [System.Runtime.CompilerServices.Extension]
  1575. public static T FirstOrDefault<T> (
  1576. IEnumerable<T> source)
  1577. {
  1578. if (source == null)
  1579. throw new ArgumentNullException ();
  1580. foreach (T element in source)
  1581. return element;
  1582. return default (T);
  1583. }
  1584. [System.Runtime.CompilerServices.Extension]
  1585. public static T FirstOrDefault<T> (
  1586. IEnumerable<T> source,
  1587. Func<T, bool> predicate)
  1588. {
  1589. if (source == null || predicate == null)
  1590. throw new ArgumentNullException ();
  1591. foreach (T element in source) {
  1592. if (predicate (element))
  1593. return element;
  1594. }
  1595. return default (T);
  1596. }
  1597. #endregion
  1598. #region Last
  1599. [System.Runtime.CompilerServices.Extension]
  1600. public static T Last<T> (
  1601. IEnumerable<T> source)
  1602. {
  1603. if (source == null)
  1604. throw new ArgumentNullException ();
  1605. bool noElements = true;
  1606. T lastElement = default (T);
  1607. foreach (T element in source)
  1608. {
  1609. if (noElements) noElements = false;
  1610. lastElement = element;
  1611. }
  1612. if (!noElements)
  1613. return lastElement;
  1614. else
  1615. throw new InvalidOperationException();
  1616. }
  1617. [System.Runtime.CompilerServices.Extension]
  1618. public static T Last<T> (
  1619. IEnumerable<T> source,
  1620. Func<T, bool> predicate)
  1621. {
  1622. if (source == null || predicate == null)
  1623. throw new ArgumentNullException ();
  1624. bool noElements = true;
  1625. T lastElement = default (T);
  1626. foreach (T element in source) {
  1627. if (predicate (element))
  1628. {
  1629. if (noElements) noElements = false;
  1630. lastElement = element;
  1631. }
  1632. }
  1633. if (!noElements)
  1634. return lastElement;
  1635. else
  1636. throw new InvalidOperationException ();
  1637. }
  1638. #endregion
  1639. #region LastOrDefault
  1640. [System.Runtime.CompilerServices.Extension]
  1641. public static T LastOrDefault<T> (
  1642. IEnumerable<T> source)
  1643. {
  1644. if (source == null)
  1645. throw new ArgumentNullException ();
  1646. T lastElement = default (T);
  1647. foreach (T element in source)
  1648. lastElement = element;
  1649. return lastElement;
  1650. }
  1651. [System.Runtime.CompilerServices.Extension]
  1652. public static T LastOrDefault<T> (
  1653. IEnumerable<T> source,
  1654. Func<T, bool> predicate)
  1655. {
  1656. if (source == null || predicate == null)
  1657. throw new ArgumentNullException ();
  1658. T lastElement = default (T);
  1659. foreach (T element in source) {
  1660. if (predicate (element))
  1661. lastElement = element;
  1662. }
  1663. return lastElement;
  1664. }
  1665. #endregion
  1666. #region Single
  1667. [System.Runtime.CompilerServices.Extension]
  1668. public static T Single<T> (
  1669. IEnumerable<T> source)
  1670. {
  1671. if (source == null)
  1672. throw new ArgumentNullException ();
  1673. bool otherElement = false;
  1674. T singleElement = default (T);
  1675. foreach (T element in source)
  1676. {
  1677. if (otherElement) throw new InvalidOperationException ();
  1678. if (!otherElement) otherElement = true;
  1679. singleElement = element;
  1680. }
  1681. if (otherElement)
  1682. return singleElement;
  1683. else
  1684. throw new InvalidOperationException();
  1685. }
  1686. [System.Runtime.CompilerServices.Extension]
  1687. public static T Single<T> (
  1688. IEnumerable<T> source,
  1689. Func<T, bool> predicate)
  1690. {
  1691. if (source == null || predicate == null)
  1692. throw new ArgumentNullException ();
  1693. bool otherElement = false;
  1694. T singleElement = default (T);
  1695. foreach (T element in source) {
  1696. if (predicate (element))
  1697. {
  1698. if (otherElement) throw new InvalidOperationException ();
  1699. if (!otherElement) otherElement = true;
  1700. singleElement = element;
  1701. }
  1702. }
  1703. if (otherElement)
  1704. return singleElement;
  1705. else
  1706. throw new InvalidOperationException ();
  1707. }
  1708. #endregion
  1709. #region SingleOrDefault
  1710. [System.Runtime.CompilerServices.Extension]
  1711. public static T SingleOrDefault<T> (
  1712. IEnumerable<T> source)
  1713. {
  1714. if (source == null)
  1715. throw new ArgumentNullException ();
  1716. bool otherElement = false;
  1717. T singleElement = default (T);
  1718. foreach (T element in source)
  1719. {
  1720. if (otherElement) throw new InvalidOperationException ();
  1721. if (!otherElement) otherElement = true;
  1722. singleElement = element;
  1723. }
  1724. return singleElement;
  1725. }
  1726. [System.Runtime.CompilerServices.Extension]
  1727. public static T SingleOrDefault<T> (
  1728. IEnumerable<T> source,
  1729. Func<T, bool> predicate)
  1730. {
  1731. if (source == null || predicate == null)
  1732. throw new ArgumentNullException ();
  1733. bool otherElement = false;
  1734. T singleElement = default (T);
  1735. foreach (T element in source) {
  1736. if (predicate (element))
  1737. {
  1738. if (otherElement) throw new InvalidOperationException ();
  1739. if (!otherElement) otherElement = true;
  1740. singleElement = element;
  1741. }
  1742. }
  1743. return singleElement;
  1744. }
  1745. #endregion
  1746. #region ElementAt
  1747. [System.Runtime.CompilerServices.Extension]
  1748. public static T ElementAt<T> (
  1749. IEnumerable<T> source,
  1750. int index)
  1751. {
  1752. if (source == null)
  1753. throw new ArgumentNullException ();
  1754. if (index < 0)
  1755. throw new ArgumentOutOfRangeException ();
  1756. if (source is IList<T>)
  1757. return ((IList<T>)source)[index];
  1758. else {
  1759. int counter = 0;
  1760. foreach (T element in source) {
  1761. if (counter == index)
  1762. return element;
  1763. counter++;
  1764. }
  1765. throw new ArgumentOutOfRangeException();
  1766. }
  1767. }
  1768. #endregion
  1769. #region ElementAtOrDefault
  1770. [System.Runtime.CompilerServices.Extension]
  1771. public static T ElementAtOrDefault<T> (
  1772. IEnumerable<T> source,
  1773. int index)
  1774. {
  1775. if (source == null)
  1776. throw new ArgumentNullException ();
  1777. if (index < 0)
  1778. return default(T);
  1779. if (source is IList<T>)
  1780. {
  1781. if (((IList<T>)source).Count >= index)
  1782. return default(T);
  1783. else
  1784. return ((IList<T>)source)[index];
  1785. }
  1786. else {
  1787. int counter = 0;
  1788. foreach (T element in source) {
  1789. if (counter == index)
  1790. return element;
  1791. counter++;
  1792. }
  1793. return default (T);
  1794. }
  1795. }
  1796. #endregion
  1797. #region DefaultIfEmpty
  1798. [System.Runtime.CompilerServices.Extension]
  1799. public static IEnumerable<T> DefaultIfEmpty<T> (
  1800. IEnumerable<T> source)
  1801. {
  1802. if (source == null)
  1803. throw new ArgumentNullException ();
  1804. bool noYield = true;
  1805. foreach (T item in source)
  1806. {
  1807. noYield = false;
  1808. yield return item;
  1809. }
  1810. if (noYield)
  1811. yield return default (T);
  1812. }
  1813. [System.Runtime.CompilerServices.Extension]
  1814. public static IEnumerable<T> DefaultIfEmpty<T> (
  1815. IEnumerable<T> source,
  1816. T defaultValue)
  1817. {
  1818. if (source == null)
  1819. throw new ArgumentNullException ();
  1820. bool noYield = true;
  1821. foreach (T item in source)
  1822. {
  1823. noYield = false;
  1824. yield return item;
  1825. }
  1826. if (noYield)
  1827. yield return defaultValue;
  1828. }
  1829. #endregion
  1830. #region EqualAll
  1831. [System.Runtime.CompilerServices.Extension]
  1832. public static bool EqualAll<T> (
  1833. IEnumerable<T> first,
  1834. IEnumerable<T> second)
  1835. {
  1836. if (first == null || second == null)
  1837. throw new ArgumentNullException ();
  1838. List<T> firstList = new List<T> (first);
  1839. List<T> secondList = new List<T> (second);
  1840. if (firstList.Count != firstList.Count)
  1841. return false;
  1842. for (int i = 0; i < firstList.Count; i++) {
  1843. if (!System.Object.Equals (firstList [i], secondList [i]))
  1844. return false;
  1845. }
  1846. // If no pair of elements is different, then everything is equal
  1847. return true;
  1848. }
  1849. #endregion
  1850. #region Range
  1851. [System.Runtime.CompilerServices.Extension]
  1852. public static IEnumerable<int> Range (
  1853. int start, int count)
  1854. {
  1855. if (count < 0 || (start + count - 1) > int.MaxValue)
  1856. throw new ArgumentOutOfRangeException ();
  1857. for (int i = start; i < (start + count - 1); i++)
  1858. yield return i;
  1859. }
  1860. #endregion
  1861. #region Repeat
  1862. [System.Runtime.CompilerServices.Extension]
  1863. public static IEnumerable<T> Repeat<T> (
  1864. T element, int count)
  1865. {
  1866. if (count < 0)
  1867. throw new ArgumentOutOfRangeException ();
  1868. for (int i = 0; i < count; i++)
  1869. yield return element;
  1870. }
  1871. #endregion
  1872. #region Empty
  1873. [System.Runtime.CompilerServices.Extension]
  1874. public static IEnumerable<T> Empty<T> ()
  1875. {
  1876. return new List<T> ();
  1877. }
  1878. #endregion
  1879. /** A NOTE ON IMPLEMENTATION REGARDING NULL KEYS
  1880. *
  1881. * GroupBy specification states that null-key values
  1882. * are allowed. However, all implementations of
  1883. * Dictionary<K, T> ban null keys.
  1884. * Because of this, a small trick has to be done:
  1885. * a special List<T> variable is created in order to
  1886. * be filled with this null-key values.
  1887. * Also, groups must be yielded in the order their
  1888. * keys were found for first time, so we need to keep
  1889. * a record on when the null-key values appeared
  1890. * (that is nullCounter variable).
  1891. * Then, when results are iterated and yielded, we
  1892. * mantain a counter and if null-key values were
  1893. * found, they are yielded in the order needed.
  1894. * Because K can be a valuetype, compilers expose a
  1895. * restriction on null values, that's why default(T)
  1896. * is used. However, default(T) is null for
  1897. * reference types, and values with selectors that
  1898. * return value types can't return null. **/
  1899. #region GroupBy
  1900. private static List<T> ContainsGroup<K, T>(
  1901. Dictionary<K, List<T>> items, K key, IEqualityComparer<K> comparer)
  1902. {
  1903. IEqualityComparer<K> comparerInUse = (comparer ?? EqualityComparer<K>.Default);
  1904. foreach (KeyValuePair<K, List<T>> value in items) {
  1905. if (comparerInUse.Equals(value.Key, key))
  1906. return value.Value;
  1907. }
  1908. return null;
  1909. }
  1910. [System.Runtime.CompilerServices.Extension]
  1911. public static IEnumerable<IGrouping<K, T>> GroupBy<T, K> (
  1912. IEnumerable<T> source,
  1913. Func<T, K> keySelector)
  1914. {
  1915. return GroupBy<T, K> (source, keySelector, null);
  1916. }
  1917. [System.Runtime.CompilerServices.Extension]
  1918. public static IEnumerable<IGrouping<K, T>> GroupBy<T, K> (
  1919. IEnumerable<T> source,
  1920. Func<T, K> keySelector,
  1921. IEqualityComparer<K> comparer)
  1922. {
  1923. if (source == null || keySelector == null)
  1924. throw new ArgumentNullException ();
  1925. Dictionary<K, List<T>> groups = new Dictionary<K, List<T>> ();
  1926. List<T> nullList = new List<T> ();
  1927. int counter = 0;
  1928. int nullCounter = -1;
  1929. foreach (T element in source) {
  1930. K key = keySelector (element);
  1931. if (key == null) {
  1932. nullList.Add (element);
  1933. if (nullCounter == -1) {
  1934. nullCounter = counter;
  1935. counter++;
  1936. }
  1937. }
  1938. else {
  1939. List<T> group = ContainsGroup<K, T> (groups, key, comparer);
  1940. if (group == null) {
  1941. group = new List<T> ();
  1942. groups.Add (key, group);
  1943. counter++;
  1944. }
  1945. group.Add (element);
  1946. }
  1947. }
  1948. counter = 0;
  1949. foreach (KeyValuePair<K, List<T>> group in groups) {
  1950. if (counter == nullCounter) {
  1951. Grouping<K, T> nullGroup = new Grouping<K, T> (default (K), nullList);
  1952. yield return nullGroup;
  1953. counter++;
  1954. }
  1955. Grouping<K, T> grouping = new Grouping<K, T> (group.Key, group.Value);
  1956. yield return grouping;
  1957. counter++;
  1958. }
  1959. }
  1960. [System.Runtime.CompilerServices.Extension]
  1961. public static IEnumerable<IGrouping<K, E>> GroupBy<T, K, E> (
  1962. IEnumerable<T> source,
  1963. Func<T, K> keySelector,
  1964. Func<T, E> elementSelector)
  1965. {
  1966. return GroupBy<T, K, E> (source, keySelector, elementSelector);
  1967. }
  1968. [System.Runtime.CompilerServices.Extension]
  1969. public static IEnumerable<IGrouping<K, E>> GroupBy<T, K, E> (
  1970. IEnumerable<T> source,
  1971. Func<T, K> keySelector,
  1972. Func<T, E> elementSelector,
  1973. IEqualityComparer<K> comparer)
  1974. {
  1975. if (source == null || keySelector == null || elementSelector == null)
  1976. throw new ArgumentNullException ();
  1977. Dictionary<K, List<E>> groups = new Dictionary<K, List<E>> ();
  1978. List<E> nullList = new List<E> ();
  1979. int counter = 0;
  1980. int nullCounter = -1;
  1981. foreach (T item in source) {
  1982. K key = keySelector (item);
  1983. E element = elementSelector (item);
  1984. if (key == null) {
  1985. nullList.Add(element);
  1986. if (nullCounter == -1) {
  1987. nullCounter = counter;
  1988. counter++;
  1989. }
  1990. }
  1991. else {
  1992. List<E> group = ContainsGroup<K, E> (groups, key, comparer);
  1993. if (group == null) {
  1994. group = new List<E> ();
  1995. groups.Add (key, group);
  1996. counter++;
  1997. }
  1998. group.Add (element);
  1999. }
  2000. }
  2001. counter = 0;
  2002. foreach (KeyValuePair<K, List<E>> group in groups) {
  2003. if (counter == nullCounter) {
  2004. Grouping<K, E> nullGroup = new Grouping<K, E> (default (K), nullList);
  2005. yield return nullGroup;
  2006. counter++;
  2007. }
  2008. Grouping<K, E> grouping = new Grouping<K, E> (group.Key, group.Value);
  2009. yield return grouping;
  2010. counter++;
  2011. }
  2012. }
  2013. #endregion
  2014. #region OrderBy
  2015. [System.Runtime.CompilerServices.Extension]
  2016. public static OrderedSequence<T> OrderBy<T, K> (
  2017. IEnumerable<T> source,
  2018. Func<T, K> keySelector)
  2019. {
  2020. return OrderBy<T, K> (source, keySelector, null);
  2021. }
  2022. [System.Runtime.CompilerServices.Extension]
  2023. public static OrderedSequence<T> OrderBy<T, K> (
  2024. IEnumerable<T> source,
  2025. Func<T, K> keySelector,
  2026. IComparer<K> comparer)
  2027. {
  2028. if (source == null || keySelector == null)
  2029. throw new ArgumentNullException ();
  2030. return new InternalOrderedSequence<T, K> (
  2031. source, keySelector, (comparer ?? Comparer<K>.Default), false, null);
  2032. }
  2033. #endregion
  2034. #region OrderByDescending
  2035. [System.Runtime.CompilerServices.Extension]
  2036. public static OrderedSequence<T> OrderByDescending<T, K> (
  2037. IEnumerable<T> source,
  2038. Func<T, K> keySelector)
  2039. {
  2040. return OrderByDescending<T, K> (source, keySelector, null);
  2041. }
  2042. [System.Runtime.CompilerServices.Extension]
  2043. public static OrderedSequence<T> OrderByDescending<T, K> (
  2044. IEnumerable<T> source,
  2045. Func<T, K> keySelector,
  2046. IComparer<K> comparer)
  2047. {
  2048. if (source == null || keySelector == null)
  2049. throw new ArgumentNullException ();
  2050. return new InternalOrderedSequence<T, K> (
  2051. source, keySelector, (comparer ?? Comparer<K>.Default), true, null);
  2052. }
  2053. #endregion
  2054. #region ThenBy
  2055. [System.Runtime.CompilerServices.Extension]
  2056. public static OrderedSequence<T> ThenBy<T, K> (
  2057. OrderedSequence<T> source,
  2058. Func<T, K> keySelector)
  2059. {
  2060. return ThenBy<T, K> (source, keySelector, null);
  2061. }
  2062. [System.Runtime.CompilerServices.Extension]
  2063. public static OrderedSequence<T> ThenBy<T, K> (
  2064. OrderedSequence<T> source,
  2065. Func<T, K> keySelector,
  2066. IComparer<K> comparer)
  2067. {
  2068. if (source == null || keySelector == null)
  2069. throw new ArgumentNullException ();
  2070. return new InternalOrderedSequence<T, K> (
  2071. source, keySelector, (comparer ?? Comparer<K>.Default), false, source);
  2072. }
  2073. #endregion
  2074. #region ThenByDescending
  2075. [System.Runtime.CompilerServices.Extension]
  2076. public static OrderedSequence<T> ThenByDescending<T, K> (
  2077. OrderedSequence<T> source,
  2078. Func<T, K> keySelector)
  2079. {
  2080. return ThenByDescending<T, K> (source, keySelector, null);
  2081. }
  2082. [System.Runtime.CompilerServices.Extension]
  2083. public static OrderedSequence<T> ThenByDescending<T, K> (
  2084. OrderedSequence<T> source,
  2085. Func<T, K> keySelector,
  2086. IComparer<K> comparer)
  2087. {
  2088. if (source == null || keySelector == null)
  2089. throw new ArgumentNullException ();
  2090. return new InternalOrderedSequence<T, K> (
  2091. source, keySelector, (comparer ?? Comparer<K>.Default), true, source);
  2092. }
  2093. #endregion
  2094. #region Reverse
  2095. [System.Runtime.CompilerServices.Extension]
  2096. public static IEnumerable<T> Reverse<T> (
  2097. IEnumerable<T> source)
  2098. {
  2099. if (source == null)
  2100. throw new ArgumentNullException ();
  2101. List<T> list = new List<T> (source);
  2102. list.Reverse ();
  2103. return list;
  2104. }
  2105. #endregion
  2106. #region Take
  2107. [System.Runtime.CompilerServices.Extension]
  2108. public static IEnumerable<T> Take<T> (
  2109. IEnumerable<T> source,
  2110. int count)
  2111. {
  2112. if (source == null)
  2113. throw new ArgumentNullException ();
  2114. if (count <= 0)
  2115. yield break;
  2116. else {
  2117. int counter = 0;
  2118. foreach (T element in source) {
  2119. yield return element;
  2120. counter++;
  2121. if (counter == count)
  2122. yield break;
  2123. }
  2124. }
  2125. }
  2126. #endregion
  2127. #region Skip
  2128. [System.Runtime.CompilerServices.Extension]
  2129. public static IEnumerable<T> Skip<T> (
  2130. IEnumerable<T> source,
  2131. int count)
  2132. {
  2133. if (source == null)
  2134. throw new ArgumentNullException ();
  2135. int counter = 0;
  2136. bool yield = false;
  2137. if (count <= 0)
  2138. yield = true;
  2139. foreach (T element in source) {
  2140. if (yield)
  2141. yield return element;
  2142. else {
  2143. counter++;
  2144. if (counter == count)
  2145. yield = true;
  2146. }
  2147. }
  2148. }
  2149. #endregion
  2150. #region TakeWhile
  2151. [System.Runtime.CompilerServices.Extension]
  2152. public static IEnumerable<T> TakeWhile<T> (
  2153. IEnumerable<T> source,
  2154. Func<T, bool> predicate)
  2155. {
  2156. if (source == null || predicate == null)
  2157. throw new ArgumentNullException ();
  2158. foreach (T element in source) {
  2159. if (predicate (element))
  2160. yield return element;
  2161. else
  2162. yield break;
  2163. }
  2164. }
  2165. [System.Runtime.CompilerServices.Extension]
  2166. public static IEnumerable<T> TakeWhile<T> (
  2167. IEnumerable<T> source,
  2168. Func<T, int, bool> predicate)
  2169. {
  2170. if (source == null || predicate == null)
  2171. throw new ArgumentNullException ();
  2172. int counter = 0;
  2173. foreach (T element in source)
  2174. {
  2175. if (predicate (element, counter))
  2176. yield return element;
  2177. else
  2178. yield break;
  2179. counter++;
  2180. }
  2181. }
  2182. #endregion
  2183. #region SkipWhile
  2184. [System.Runtime.CompilerServices.Extension]
  2185. public static IEnumerable<T> SkipWhile<T> (
  2186. IEnumerable<T> source,
  2187. Func<T, bool> predicate)
  2188. {
  2189. if (source == null || predicate == null)
  2190. throw new ArgumentNullException ();
  2191. bool yield = false;
  2192. foreach (T element in source) {
  2193. if (yield)
  2194. yield return element;
  2195. else
  2196. if (!predicate (element)) {
  2197. yield return element;
  2198. yield = true;
  2199. }
  2200. }
  2201. }
  2202. [System.Runtime.CompilerServices.Extension]
  2203. public static IEnumerable<T> SkipWhile<T> (
  2204. IEnumerable<T> source,
  2205. Func<T, int, bool> predicate)
  2206. {
  2207. if (source == null || predicate == null)
  2208. throw new ArgumentNullException();
  2209. int counter = 0;
  2210. bool yield = false;
  2211. foreach (T element in source) {
  2212. if (yield)
  2213. yield return element;
  2214. else
  2215. if (!predicate (element, counter)) {
  2216. yield return element;
  2217. yield = true;
  2218. }
  2219. counter++;
  2220. }
  2221. }
  2222. #endregion
  2223. #region Select
  2224. [System.Runtime.CompilerServices.Extension]
  2225. public static IEnumerable<S> Select<T, S> (
  2226. IEnumerable<T> source,
  2227. Func<T, S> selector)
  2228. {
  2229. if (source == null || selector == null)
  2230. throw new ArgumentNullException ();
  2231. foreach (T element in source)
  2232. yield return selector (element);
  2233. }
  2234. [System.Runtime.CompilerServices.Extension]
  2235. public static IEnumerable<S> Select<T, S> (
  2236. IEnumerable<T> source,
  2237. Func<T, int, S> selector)
  2238. {
  2239. if (source == null || selector == null)
  2240. throw new ArgumentNullException ();
  2241. int counter = 0;
  2242. foreach (T element in source) {
  2243. yield return selector (element, counter);
  2244. counter++;
  2245. }
  2246. }
  2247. #endregion
  2248. #region SelectMany
  2249. [System.Runtime.CompilerServices.Extension]
  2250. public static IEnumerable<S> SelectMany<T, S> (
  2251. IEnumerable<T> source,
  2252. Func<T, IEnumerable<S>> selector)
  2253. {
  2254. if (source == null || selector == null)
  2255. throw new ArgumentNullException ();
  2256. foreach (T element in source)
  2257. foreach (S item in selector (element))
  2258. yield return item;
  2259. }
  2260. [System.Runtime.CompilerServices.Extension]
  2261. public static IEnumerable<S> SelectMany<T, S> (
  2262. IEnumerable<T> source,
  2263. Func<T, int, IEnumerable<S>> selector)
  2264. {
  2265. if (source == null || selector == null)
  2266. throw new ArgumentNullException ();
  2267. int counter = 0;
  2268. foreach (T element in source) {
  2269. foreach (S item in selector (element, counter))
  2270. yield return item;
  2271. counter++;
  2272. }
  2273. }
  2274. #endregion
  2275. #region Any
  2276. [System.Runtime.CompilerServices.Extension]
  2277. public static bool Any<T> (
  2278. IEnumerable<T> source)
  2279. {
  2280. if (source == null)
  2281. throw new ArgumentNullException ();
  2282. foreach (T element in source)
  2283. return true;
  2284. return false;
  2285. }
  2286. [System.Runtime.CompilerServices.Extension]
  2287. public static bool Any<T> (
  2288. IEnumerable<T> source,
  2289. Func<T, bool> predicate)
  2290. {
  2291. if (source == null || predicate == null)
  2292. throw new ArgumentNullException ();
  2293. foreach (T element in source)
  2294. if (predicate(element))
  2295. return true;
  2296. return false;
  2297. }
  2298. #endregion
  2299. #region All
  2300. [System.Runtime.CompilerServices.Extension]
  2301. public static bool All<T> (
  2302. IEnumerable<T> source,
  2303. Func<T, bool> predicate)
  2304. {
  2305. if (source == null || predicate == null)
  2306. throw new ArgumentNullException ();
  2307. foreach (T element in source)
  2308. if (!predicate(element))
  2309. return false;
  2310. return true;
  2311. }
  2312. #endregion
  2313. #region Contains
  2314. [System.Runtime.CompilerServices.Extension]
  2315. public static bool Contains<T> (
  2316. IEnumerable<T> source,
  2317. T value)
  2318. {
  2319. if (source is ICollection<T>) {
  2320. ICollection<T> collection = (ICollection<T>)source;
  2321. return collection.Contains(value);
  2322. }
  2323. else {
  2324. foreach (T element in source)
  2325. if (Equals(element, value))
  2326. return true;
  2327. return false;
  2328. }
  2329. }
  2330. #endregion
  2331. #region Where
  2332. [System.Runtime.CompilerServices.Extension]
  2333. public static IEnumerable<T> Where<T> (
  2334. IEnumerable<T> source,
  2335. Func<T, bool> predicate)
  2336. {
  2337. if (source == null || predicate == null)
  2338. throw new ArgumentNullException ();
  2339. foreach (T element in source)
  2340. if (predicate (element))
  2341. yield return element;
  2342. }
  2343. [System.Runtime.CompilerServices.Extension]
  2344. public static IEnumerable<T> Where<T> (
  2345. IEnumerable<T> source,
  2346. Func<T, int, bool> predicate)
  2347. {
  2348. if (source == null || predicate == null)
  2349. throw new ArgumentNullException ();
  2350. int counter = 0;
  2351. foreach (T element in source) {
  2352. if (predicate (element, counter))
  2353. yield return element;
  2354. counter++;
  2355. }
  2356. }
  2357. #endregion
  2358. #region Distinct
  2359. [System.Runtime.CompilerServices.Extension]
  2360. public static IEnumerable<T> Distinct<T> (
  2361. IEnumerable<T> source)
  2362. {
  2363. if (source == null)
  2364. throw new ArgumentNullException ();
  2365. List<T> items = new List<T> ();
  2366. foreach (T element in source) {
  2367. if (IndexOf (items, element) == -1) {
  2368. items.Add (element);
  2369. yield return element;
  2370. }
  2371. }
  2372. }
  2373. #endregion
  2374. #region Union
  2375. [System.Runtime.CompilerServices.Extension]
  2376. public static IEnumerable<T> Union<T> (
  2377. IEnumerable<T> first,
  2378. IEnumerable<T> second)
  2379. {
  2380. if (first == null || second == null)
  2381. throw new ArgumentNullException ();
  2382. List<T> items = new List<T> ();
  2383. foreach (T element in first) {
  2384. if (IndexOf (items, element) == -1) {
  2385. items.Add (element);
  2386. yield return element;
  2387. }
  2388. }
  2389. foreach (T element in second) {
  2390. if (IndexOf (items, element) == -1) {
  2391. items.Add (element);
  2392. yield return element;
  2393. }
  2394. }
  2395. }
  2396. #endregion
  2397. #region Intersect
  2398. [System.Runtime.CompilerServices.Extension]
  2399. public static IEnumerable<T> Intersect<T> (
  2400. IEnumerable<T> first,
  2401. IEnumerable<T> second)
  2402. {
  2403. if (first == null || second == null)
  2404. throw new ArgumentNullException ();
  2405. List<T> items = new List<T> (Distinct (first));
  2406. bool[] marked = new bool [items.Count];
  2407. for (int i = 0; i < marked.Length; i++)
  2408. marked[i] = false;
  2409. foreach (T element in second) {
  2410. int index = IndexOf (items, element);
  2411. if (index != -1)
  2412. marked [index] = true;
  2413. }
  2414. for (int i = 0; i < marked.Length; i++) {
  2415. if (marked [i])
  2416. yield return items [i];
  2417. }
  2418. }
  2419. #endregion
  2420. #region Except
  2421. [System.Runtime.CompilerServices.Extension]
  2422. public static IEnumerable<T> Except<T> (
  2423. IEnumerable<T> first,
  2424. IEnumerable<T> second)
  2425. {
  2426. if (first == null || second == null)
  2427. throw new ArgumentNullException ();
  2428. List<T> items = new List<T> (Distinct (first));
  2429. foreach (T element in second) {
  2430. int index = IndexOf (items, element);
  2431. if (index == -1)
  2432. items.Add (element);
  2433. else
  2434. items.RemoveAt (index);
  2435. }
  2436. foreach (T item in items)
  2437. yield return item;
  2438. }
  2439. #endregion
  2440. # region Join
  2441. [System.Runtime.CompilerServices.Extension]
  2442. public static IEnumerable<V> Join<T, U, K, V> (
  2443. IEnumerable<T> outer,
  2444. IEnumerable<U> inner,
  2445. Func<T, K> outerKeySelector,
  2446. Func<U, K> innerKeySelector,
  2447. Func<T, U, V> resultSelector)
  2448. {
  2449. if (outer == null || inner == null || outerKeySelector == null ||
  2450. innerKeySelector == null || resultSelector == null)
  2451. throw new ArgumentNullException ();
  2452. Lookup<K, U> innerKeys = ToLookup<U, K> (inner, innerKeySelector);
  2453. /*Dictionary<K, List<U>> innerKeys = new Dictionary<K, List<U>> ();
  2454. foreach (U element in inner)
  2455. {
  2456. K innerKey = innerKeySelector (element);
  2457. if (!innerKeys.ContainsKey (innerKey))
  2458. innerKeys.Add (innerKey, new List<U> ());
  2459. innerKeys[innerKey].Add (element);
  2460. }*/
  2461. foreach (T element in outer)
  2462. {
  2463. K outerKey = outerKeySelector (element);
  2464. if (innerKeys.Contains (outerKey))
  2465. {
  2466. foreach (U innerElement in innerKeys [outerKey])
  2467. yield return resultSelector (element, innerElement);
  2468. }
  2469. }
  2470. }
  2471. # endregion
  2472. # region GroupJoin
  2473. [System.Runtime.CompilerServices.Extension]
  2474. public static IEnumerable<V> GroupJoin<T, U, K, V> (
  2475. IEnumerable<T> outer,
  2476. IEnumerable<U> inner,
  2477. Func<T, K> outerKeySelector,
  2478. Func<U, K> innerKeySelector,
  2479. Func<T, IEnumerable<U>, V> resultSelector)
  2480. {
  2481. if (outer == null || inner == null || outerKeySelector == null ||
  2482. innerKeySelector == null || resultSelector == null)
  2483. throw new ArgumentNullException ();
  2484. Lookup<K, U> innerKeys = ToLookup<U, K> (inner, innerKeySelector);
  2485. /*Dictionary<K, List<U>> innerKeys = new Dictionary<K, List<U>> ();
  2486. foreach (U element in inner)
  2487. {
  2488. K innerKey = innerKeySelector (element);
  2489. if (!innerKeys.ContainsKey (innerKey))
  2490. innerKeys.Add (innerKey, new List<U> ());
  2491. innerKeys[innerKey].Add (element);
  2492. }*/
  2493. foreach (T element in outer)
  2494. {
  2495. K outerKey = outerKeySelector (element);
  2496. if (innerKeys.Contains (outerKey))
  2497. yield return resultSelector (element, innerKeys [outerKey]);
  2498. }
  2499. }
  2500. # endregion
  2501. // These methods are not included in the
  2502. // .NET Standard Query Operators Specification,
  2503. // but they provide additional useful commands
  2504. #region Compare
  2505. [System.Runtime.CompilerServices.Extension]
  2506. private static bool Equals<T> (
  2507. T first, T second)
  2508. {
  2509. // Mostly, values in Enumerable<T>
  2510. // sequences need to be compared using
  2511. // Equals and GetHashCode
  2512. if (first == null || second == null)
  2513. return (first == null && second == null);
  2514. else
  2515. return ((first.Equals (second) ||
  2516. first.GetHashCode () == second.GetHashCode ()));
  2517. }
  2518. #endregion
  2519. #region IndexOf
  2520. [System.Runtime.CompilerServices.Extension]
  2521. public static int IndexOf<T>(
  2522. IEnumerable<T> source,
  2523. T item)
  2524. {
  2525. int counter = 0;
  2526. foreach (T element in source) {
  2527. if (Equals(element, item))
  2528. return counter;
  2529. counter++;
  2530. }
  2531. // The item was not found
  2532. return -1;
  2533. }
  2534. #endregion
  2535. }
  2536. }