Enumerable.cs 65 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689
  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. // Marek Safar ([email protected])
  21. // Antonello Provenzano <[email protected]>
  22. // Alejandro Serrano "Serras" ([email protected])
  23. //
  24. using System;
  25. using System.Collections;
  26. using System.Collections.Generic;
  27. using System.Collections.ObjectModel;
  28. namespace System.Linq
  29. {
  30. public static class Enumerable
  31. {
  32. #region Aggregate
  33. public static TSource Aggregate<TSource> (this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func)
  34. {
  35. if (source == null)
  36. throw new ArgumentNullException ("source");
  37. if (func == null)
  38. throw new ArgumentNullException ("func");
  39. // custom foreach so that we can efficiently throw an exception
  40. // if zero elements and treat the first element differently
  41. using (IEnumerator<TSource> enumerator = source.GetEnumerator ()) {
  42. if (!enumerator.MoveNext ())
  43. throw new InvalidOperationException ("No elements in source list");
  44. TSource folded = enumerator.Current;
  45. while (enumerator.MoveNext ())
  46. folded = func (folded, enumerator.Current);
  47. return folded;
  48. }
  49. }
  50. public static TAccumulate Aggregate<TSource, TAccumulate> (this IEnumerable<TSource> source,
  51. TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func)
  52. {
  53. if (source == null || func == null)
  54. throw new ArgumentNullException ();
  55. TAccumulate folded = seed;
  56. foreach (TSource element in source)
  57. folded = func (folded, element);
  58. return folded;
  59. }
  60. public static TResult Aggregate<TSource, TAccumulate, TResult> (this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector)
  61. {
  62. if (source == null)
  63. throw new ArgumentNullException ("source");
  64. if (func == null)
  65. throw new ArgumentNullException ("func");
  66. if (resultSelector == null)
  67. throw new ArgumentNullException ("resultSelector");
  68. TAccumulate result = seed;
  69. foreach (TSource e in source)
  70. result = func (result, e);
  71. return resultSelector (result);
  72. }
  73. #endregion
  74. #region All
  75. public static bool All<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate)
  76. {
  77. if (source == null || predicate == null)
  78. throw new ArgumentNullException ();
  79. foreach (TSource element in source)
  80. if (!predicate (element))
  81. return false;
  82. return true;
  83. }
  84. #endregion
  85. #region Any
  86. public static bool Any<TSource> (this IEnumerable<TSource> source)
  87. {
  88. if (source == null)
  89. throw new ArgumentNullException ();
  90. foreach (TSource element in source)
  91. return true;
  92. return false;
  93. }
  94. public static bool Any<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate)
  95. {
  96. if (source == null || predicate == null)
  97. throw new ArgumentNullException ();
  98. foreach (TSource element in source)
  99. if (predicate (element))
  100. return true;
  101. return false;
  102. }
  103. #endregion
  104. #region AsEnumerable
  105. public static IEnumerable<TSource> AsEnumerable<TSource> (this IEnumerable<TSource> source)
  106. {
  107. return source;
  108. }
  109. #endregion
  110. #region Average
  111. public static double Average (this IEnumerable<int> source)
  112. {
  113. if (source == null)
  114. throw new ArgumentNullException ();
  115. long sum = 0;
  116. long counter = 0;
  117. foreach (int element in source) {
  118. sum += element;
  119. counter++;
  120. }
  121. if (counter == 0)
  122. throw new InvalidOperationException ();
  123. else
  124. return (double) sum / (double) counter;
  125. }
  126. public static double? Average (this IEnumerable<int?> source)
  127. {
  128. if (source == null)
  129. throw new ArgumentNullException ();
  130. bool onlyNull = true;
  131. long sum = 0;
  132. long counter = 0;
  133. foreach (int? element in source) {
  134. if (element.HasValue) {
  135. onlyNull = false;
  136. sum += element.Value;
  137. counter++;
  138. }
  139. }
  140. return (onlyNull ? null : (double?) sum / (double?) counter);
  141. }
  142. public static double Average (this IEnumerable<long> source)
  143. {
  144. if (source == null)
  145. throw new ArgumentNullException ();
  146. long sum = 0;
  147. long counter = 0;
  148. foreach (long element in source) {
  149. sum += element;
  150. counter++;
  151. }
  152. if (counter == 0)
  153. throw new InvalidOperationException ();
  154. else
  155. return (double) sum / (double) counter;
  156. }
  157. public static double? Average (this IEnumerable<long?> source)
  158. {
  159. if (source == null)
  160. throw new ArgumentNullException ();
  161. bool onlyNull = true;
  162. long sum = 0;
  163. long counter = 0;
  164. foreach (long? element in source) {
  165. if (element.HasValue) {
  166. onlyNull = false;
  167. sum += element.Value;
  168. counter++;
  169. }
  170. }
  171. return (onlyNull ? null : (double?) sum / (double?) counter);
  172. }
  173. public static double Average (this IEnumerable<double> source)
  174. {
  175. if (source == null)
  176. throw new ArgumentNullException ();
  177. double sum = 0;
  178. double counter = 0;
  179. foreach (double element in source) {
  180. sum += element;
  181. counter++;
  182. }
  183. if (counter == 0)
  184. throw new InvalidOperationException ();
  185. else
  186. return sum / counter;
  187. }
  188. public static double? Average (this IEnumerable<double?> source)
  189. {
  190. if (source == null)
  191. throw new ArgumentNullException ();
  192. bool onlyNull = true;
  193. double sum = 0;
  194. double counter = 0;
  195. foreach (double? element in source) {
  196. if (element.HasValue) {
  197. onlyNull = false;
  198. sum += element.Value;
  199. counter++;
  200. }
  201. }
  202. return (onlyNull ? null : (double?) (sum / counter));
  203. }
  204. public static decimal Average (this IEnumerable<decimal> source)
  205. {
  206. if (source == null)
  207. throw new ArgumentNullException ();
  208. decimal sum = 0;
  209. decimal counter = 0;
  210. foreach (decimal element in source) {
  211. sum += element;
  212. counter++;
  213. }
  214. if (counter == 0)
  215. throw new InvalidOperationException ();
  216. else
  217. return sum / counter;
  218. }
  219. public static decimal? Average (this IEnumerable<decimal?> source)
  220. {
  221. if (source == null)
  222. throw new ArgumentNullException ();
  223. bool onlyNull = true;
  224. decimal sum = 0;
  225. decimal counter = 0;
  226. foreach (decimal? element in source) {
  227. if (element.HasValue) {
  228. onlyNull = false;
  229. sum += element.Value;
  230. counter++;
  231. }
  232. }
  233. return (onlyNull ? null : (decimal?) (sum / counter));
  234. }
  235. public static double Average<TSource> (this IEnumerable<TSource> source, Func<TSource, int> selector)
  236. {
  237. if (source == null || selector == null)
  238. throw new ArgumentNullException ();
  239. long sum = 0;
  240. long counter = 0;
  241. foreach (TSource item in source) {
  242. sum += selector (item);
  243. counter++;
  244. }
  245. if (counter == 0)
  246. throw new InvalidOperationException ();
  247. else
  248. return (double) sum / (double) counter;
  249. }
  250. public static double? Average<TSource> (this IEnumerable<TSource> source, Func<TSource, int?> selector)
  251. {
  252. if (source == null || selector == null)
  253. throw new ArgumentNullException ();
  254. bool onlyNull = true;
  255. long sum = 0;
  256. long counter = 0;
  257. foreach (TSource item in source) {
  258. int? element = selector (item);
  259. if (element.HasValue) {
  260. onlyNull = false;
  261. sum += element.Value;
  262. counter++;
  263. }
  264. }
  265. return (onlyNull ? null : (double?) sum / (double?) counter);
  266. }
  267. public static double Average<TSource> (this IEnumerable<TSource> source, Func<TSource, long> selector)
  268. {
  269. if (source == null || selector == null)
  270. throw new ArgumentNullException ();
  271. long sum = 0;
  272. long counter = 0;
  273. foreach (TSource item in source) {
  274. sum += selector (item);
  275. counter++;
  276. }
  277. if (counter == 0)
  278. throw new InvalidOperationException ();
  279. else
  280. return (double) sum / (double) counter;
  281. }
  282. public static double? Average<TSource> (this IEnumerable<TSource> source, Func<TSource, long?> selector)
  283. {
  284. if (source == null || selector == null)
  285. throw new ArgumentNullException ();
  286. bool onlyNull = true;
  287. long sum = 0;
  288. long counter = 0;
  289. foreach (TSource item in source) {
  290. long? element = selector (item);
  291. if (element.HasValue) {
  292. onlyNull = false;
  293. sum += element.Value;
  294. counter++;
  295. }
  296. }
  297. return (onlyNull ? null : (double?) sum / (double?) counter);
  298. }
  299. public static double Average<TSource> (this IEnumerable<TSource> source, Func<TSource, double> selector)
  300. {
  301. if (source == null || selector == null)
  302. throw new ArgumentNullException ();
  303. double sum = 0;
  304. double counter = 0;
  305. foreach (TSource item in source) {
  306. sum += selector (item);
  307. counter++;
  308. }
  309. if (counter == 0)
  310. throw new InvalidOperationException ();
  311. else
  312. return sum / counter;
  313. }
  314. public static double? Average<TSource> (this IEnumerable<TSource> source, Func<TSource, double?> selector)
  315. {
  316. if (source == null || selector == null)
  317. throw new ArgumentNullException ();
  318. bool onlyNull = true;
  319. double sum = 0;
  320. double counter = 0;
  321. foreach (TSource item in source) {
  322. double? element = selector (item);
  323. if (element.HasValue) {
  324. onlyNull = false;
  325. sum += element.Value;
  326. counter++;
  327. }
  328. }
  329. return (onlyNull ? null : (double?) (sum / counter));
  330. }
  331. public static decimal Average<TSource> (this IEnumerable<TSource> source, Func<TSource, decimal> selector)
  332. {
  333. if (source == null || selector == null)
  334. throw new ArgumentNullException ();
  335. decimal sum = 0;
  336. decimal counter = 0;
  337. foreach (TSource item in source) {
  338. sum += selector (item);
  339. counter++;
  340. }
  341. if (counter == 0)
  342. throw new InvalidOperationException ();
  343. else
  344. return sum / counter;
  345. }
  346. public static decimal? Average<TSource> (this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
  347. {
  348. if (source == null || selector == null)
  349. throw new ArgumentNullException ();
  350. bool onlyNull = true;
  351. decimal sum = 0;
  352. decimal counter = 0;
  353. foreach (TSource item in source) {
  354. decimal? element = selector (item);
  355. if (element.HasValue) {
  356. onlyNull = false;
  357. sum += element.Value;
  358. counter++;
  359. }
  360. }
  361. return (onlyNull ? null : (decimal?) (sum / counter));
  362. }
  363. #endregion
  364. #region Cast
  365. public static IEnumerable<TResult> Cast<TResult> (this IEnumerable source)
  366. {
  367. if (source == null)
  368. throw new ArgumentNullException ();
  369. foreach (object element in source)
  370. yield return (TResult) element;
  371. }
  372. #endregion
  373. #region Concat
  374. public static IEnumerable<TSource> Concat<TSource> (this IEnumerable<TSource> first, IEnumerable<TSource> second)
  375. {
  376. if (first == null || second == null)
  377. throw new ArgumentNullException ();
  378. foreach (TSource element in first)
  379. yield return element;
  380. foreach (TSource element in second)
  381. yield return element;
  382. }
  383. #endregion
  384. #region Contains
  385. public static bool Contains<TSource> (this IEnumerable<TSource> source, TSource value)
  386. {
  387. ICollection<TSource> collection = source as ICollection<TSource>;
  388. if (collection != null)
  389. return collection.Contains (value);
  390. return Contains<TSource> (source, value, null);
  391. }
  392. public static bool Contains<TSource> (this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer)
  393. {
  394. if (source == null)
  395. throw new ArgumentNullException ("source");
  396. if (comparer == null)
  397. comparer = EqualityComparer<TSource>.Default;
  398. foreach (TSource e in source) {
  399. if (comparer.Equals (e, value))
  400. return true;
  401. }
  402. return false;
  403. }
  404. #endregion
  405. #region Count
  406. public static int Count<TSource> (this IEnumerable<TSource> source)
  407. {
  408. if (source == null)
  409. throw new ArgumentNullException ();
  410. ICollection<TSource> collection = source as ICollection<TSource>;
  411. if (collection != null)
  412. return collection.Count;
  413. int counter = 0;
  414. foreach (TSource element in source)
  415. counter++;
  416. return counter;
  417. }
  418. public static int Count<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> selector)
  419. {
  420. if (source == null || selector == null)
  421. throw new ArgumentNullException ();
  422. int counter = 0;
  423. foreach (TSource element in source)
  424. if (selector (element))
  425. counter++;
  426. return counter;
  427. }
  428. #endregion
  429. #region DefaultIfEmpty
  430. public static IEnumerable<TSource> DefaultIfEmpty<TSource> (this IEnumerable<TSource> source)
  431. {
  432. return DefaultIfEmpty (source, default (TSource));
  433. }
  434. public static IEnumerable<TSource> DefaultIfEmpty<TSource> (this IEnumerable<TSource> source, TSource defaultValue)
  435. {
  436. if (source == null)
  437. throw new ArgumentNullException ("source");
  438. bool noYield = true;
  439. foreach (TSource item in source) {
  440. noYield = false;
  441. yield return item;
  442. }
  443. if (noYield)
  444. yield return defaultValue;
  445. }
  446. #endregion
  447. #region Distinct
  448. public static IEnumerable<TSource> Distinct<TSource> (this IEnumerable<TSource> source)
  449. {
  450. return Distinct<TSource> (source, null);
  451. }
  452. public static IEnumerable<TSource> Distinct<TSource> (this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
  453. {
  454. if (source == null)
  455. throw new ArgumentNullException ();
  456. if (comparer == null)
  457. comparer = EqualityComparer<TSource>.Default;
  458. List<TSource> items = new List<TSource> (); // TODO: use a HashSet here
  459. foreach (TSource element in source) {
  460. if (!Contains (items, element, comparer)) {
  461. items.Add (element);
  462. yield return element;
  463. }
  464. }
  465. }
  466. #endregion
  467. #region ElementAt
  468. public static TSource ElementAt<TSource> (this IEnumerable<TSource> source, int index)
  469. {
  470. if (source == null)
  471. throw new ArgumentNullException ();
  472. if (index < 0)
  473. throw new ArgumentOutOfRangeException ();
  474. IList<TSource> list = source as IList<TSource>;
  475. if (list != null)
  476. return list [index];
  477. int counter = 0;
  478. foreach (TSource element in source) {
  479. if (counter == index)
  480. return element;
  481. counter++;
  482. }
  483. throw new ArgumentOutOfRangeException ();
  484. }
  485. #endregion
  486. #region ElementAtOrDefault
  487. public static TSource ElementAtOrDefault<TSource> (this IEnumerable<TSource> source, int index)
  488. {
  489. if (source == null)
  490. throw new ArgumentNullException ();
  491. if (index < 0)
  492. return default (TSource);
  493. IList<TSource> list = source as IList<TSource>;
  494. if (list != null)
  495. return index < list.Count ? list [index] : default (TSource);
  496. int counter = 0;
  497. foreach (TSource element in source) {
  498. if (counter == index)
  499. return element;
  500. counter++;
  501. }
  502. return default (TSource);
  503. }
  504. #endregion
  505. #region Empty
  506. public static IEnumerable<TResult> Empty<TResult> ()
  507. {
  508. return new List<TResult> ();
  509. }
  510. #endregion
  511. #region Except
  512. public static IEnumerable<TSource> Except<TSource> (this IEnumerable<TSource> first, IEnumerable<TSource> second)
  513. {
  514. return Except (first, second, null);
  515. }
  516. public static IEnumerable<TSource> Except<TSource> (this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
  517. {
  518. if (first == null || second == null)
  519. throw new ArgumentNullException ();
  520. if (comparer == null)
  521. comparer = EqualityComparer<TSource>.Default;
  522. List<TSource> items = new List<TSource> (Distinct (second));
  523. foreach (TSource element in first) {
  524. if (!Contains (items, element, comparer))
  525. yield return element;
  526. }
  527. }
  528. #endregion
  529. #region First
  530. public static TSource First<TSource> (this IEnumerable<TSource> source)
  531. {
  532. if (source == null)
  533. throw new ArgumentNullException ();
  534. foreach (TSource element in source)
  535. return element;
  536. throw new InvalidOperationException ();
  537. }
  538. public static TSource First<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate)
  539. {
  540. if (source == null || predicate == null)
  541. throw new ArgumentNullException ();
  542. foreach (TSource element in source) {
  543. if (predicate (element))
  544. return element;
  545. }
  546. throw new InvalidOperationException ();
  547. }
  548. #endregion
  549. #region FirstOrDefault
  550. public static TSource FirstOrDefault<TSource> (this IEnumerable<TSource> source)
  551. {
  552. if (source == null)
  553. throw new ArgumentNullException ();
  554. foreach (TSource element in source)
  555. return element;
  556. return default (TSource);
  557. }
  558. public static TSource FirstOrDefault<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate)
  559. {
  560. if (source == null || predicate == null)
  561. throw new ArgumentNullException ();
  562. foreach (TSource element in source) {
  563. if (predicate (element))
  564. return element;
  565. }
  566. return default (TSource);
  567. }
  568. #endregion
  569. #region GroupBy
  570. private static List<T> ContainsGroup<K, T> (
  571. Dictionary<K, List<T>> items, K key, IEqualityComparer<K> comparer)
  572. {
  573. IEqualityComparer<K> comparerInUse = (comparer ?? EqualityComparer<K>.Default);
  574. foreach (KeyValuePair<K, List<T>> value in items) {
  575. if (comparerInUse.Equals (value.Key, key))
  576. return value.Value;
  577. }
  578. return null;
  579. }
  580. public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey> (this IEnumerable<TSource> source,
  581. Func<TSource, TKey> keySelector)
  582. {
  583. return GroupBy<TSource, TKey> (source, keySelector, null);
  584. }
  585. public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey> (this IEnumerable<TSource> source,
  586. Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
  587. {
  588. if (source == null || keySelector == null)
  589. throw new ArgumentNullException ();
  590. Dictionary<TKey, List<TSource>> groups = new Dictionary<TKey, List<TSource>> ();
  591. List<TSource> nullList = new List<TSource> ();
  592. int counter = 0;
  593. int nullCounter = -1;
  594. foreach (TSource element in source) {
  595. TKey key = keySelector (element);
  596. if (key == null) {
  597. nullList.Add (element);
  598. if (nullCounter == -1) {
  599. nullCounter = counter;
  600. counter++;
  601. }
  602. } else {
  603. List<TSource> group = ContainsGroup<TKey, TSource> (groups, key, comparer);
  604. if (group == null) {
  605. group = new List<TSource> ();
  606. groups.Add (key, group);
  607. counter++;
  608. }
  609. group.Add (element);
  610. }
  611. }
  612. counter = 0;
  613. foreach (KeyValuePair<TKey, List<TSource>> group in groups) {
  614. if (counter == nullCounter) {
  615. Grouping<TKey, TSource> nullGroup = new Grouping<TKey, TSource> (default (TKey), nullList);
  616. yield return nullGroup;
  617. counter++;
  618. }
  619. Grouping<TKey, TSource> grouping = new Grouping<TKey, TSource> (group.Key, group.Value);
  620. yield return grouping;
  621. counter++;
  622. }
  623. }
  624. public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement> (this IEnumerable<TSource> source,
  625. Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
  626. {
  627. return GroupBy<TSource, TKey, TElement> (source, keySelector, elementSelector, null);
  628. }
  629. public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement> (this IEnumerable<TSource> source,
  630. Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
  631. {
  632. if (source == null || keySelector == null || elementSelector == null)
  633. throw new ArgumentNullException ();
  634. Dictionary<TKey, List<TElement>> groups = new Dictionary<TKey, List<TElement>> ();
  635. List<TElement> nullList = new List<TElement> ();
  636. int counter = 0;
  637. int nullCounter = -1;
  638. foreach (TSource item in source) {
  639. TKey key = keySelector (item);
  640. TElement element = elementSelector (item);
  641. if (key == null) {
  642. nullList.Add (element);
  643. if (nullCounter == -1) {
  644. nullCounter = counter;
  645. counter++;
  646. }
  647. } else {
  648. List<TElement> group = ContainsGroup<TKey, TElement> (groups, key, comparer);
  649. if (group == null) {
  650. group = new List<TElement> ();
  651. groups.Add (key, group);
  652. counter++;
  653. }
  654. group.Add (element);
  655. }
  656. }
  657. counter = 0;
  658. foreach (KeyValuePair<TKey, List<TElement>> group in groups) {
  659. if (counter == nullCounter) {
  660. Grouping<TKey, TElement> nullGroup = new Grouping<TKey, TElement> (default (TKey), nullList);
  661. yield return nullGroup;
  662. counter++;
  663. }
  664. Grouping<TKey, TElement> grouping = new Grouping<TKey, TElement> (group.Key, group.Value);
  665. yield return grouping;
  666. counter++;
  667. }
  668. }
  669. #endregion
  670. # region GroupJoin
  671. public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult> (this IEnumerable<TOuter> outer,
  672. IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector,
  673. Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector)
  674. {
  675. return GroupJoin (outer, inner, outerKeySelector, innerKeySelector, resultSelector, null);
  676. }
  677. public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult> (this IEnumerable<TOuter> outer,
  678. IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector,
  679. Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector,
  680. IEqualityComparer<TKey> comparer)
  681. {
  682. if (outer == null || inner == null || outerKeySelector == null ||
  683. innerKeySelector == null || resultSelector == null)
  684. throw new ArgumentNullException ();
  685. if (comparer == null)
  686. comparer = EqualityComparer<TKey>.Default;
  687. Lookup<TKey, TInner> innerKeys = ToLookup<TInner, TKey> (inner, innerKeySelector, comparer);
  688. /*Dictionary<K, List<U>> innerKeys = new Dictionary<K, List<U>> ();
  689. foreach (U element in inner)
  690. {
  691. K innerKey = innerKeySelector (element);
  692. if (!innerKeys.ContainsKey (innerKey))
  693. innerKeys.Add (innerKey, new List<U> ());
  694. innerKeys[innerKey].Add (element);
  695. }*/
  696. foreach (TOuter element in outer) {
  697. TKey outerKey = outerKeySelector (element);
  698. if (innerKeys.Contains (outerKey))
  699. yield return resultSelector (element, innerKeys [outerKey]);
  700. else
  701. yield return resultSelector (element, Empty<TInner> ());
  702. }
  703. }
  704. #endregion
  705. #region Intersect
  706. public static IEnumerable<TSource> Intersect<TSource> (this IEnumerable<TSource> first, IEnumerable<TSource> second)
  707. {
  708. return Intersect (first, second, null);
  709. }
  710. public static IEnumerable<TSource> Intersect<TSource> (this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
  711. {
  712. if (first == null || second == null)
  713. throw new ArgumentNullException ();
  714. if (comparer == null)
  715. comparer = EqualityComparer<TSource>.Default;
  716. List<TSource> items = new List<TSource> (Distinct (first));
  717. foreach (TSource element in second) {
  718. if (Contains (items, element, comparer))
  719. yield return element;
  720. }
  721. }
  722. #endregion
  723. # region Join
  724. public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult> (this IEnumerable<TOuter> outer,
  725. IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector,
  726. Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector, IEqualityComparer<TKey> comparer)
  727. {
  728. if (outer == null || inner == null || outerKeySelector == null ||
  729. innerKeySelector == null || resultSelector == null)
  730. throw new ArgumentNullException ();
  731. if (comparer == null)
  732. comparer = EqualityComparer<TKey>.Default;
  733. Lookup<TKey, TInner> innerKeys = ToLookup<TInner, TKey> (inner, innerKeySelector, comparer);
  734. /*Dictionary<K, List<U>> innerKeys = new Dictionary<K, List<U>> ();
  735. foreach (U element in inner)
  736. {
  737. K innerKey = innerKeySelector (element);
  738. if (!innerKeys.ContainsKey (innerKey))
  739. innerKeys.Add (innerKey, new List<U> ());
  740. innerKeys[innerKey].Add (element);
  741. }*/
  742. foreach (TOuter element in outer) {
  743. TKey outerKey = outerKeySelector (element);
  744. if (innerKeys.Contains (outerKey)) {
  745. foreach (TInner innerElement in innerKeys [outerKey])
  746. yield return resultSelector (element, innerElement);
  747. }
  748. }
  749. }
  750. public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult> (this IEnumerable<TOuter> outer,
  751. IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector,
  752. Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector)
  753. {
  754. return Join<TOuter, TInner, TKey, TResult> (outer, inner, outerKeySelector, innerKeySelector, resultSelector, null);
  755. }
  756. # endregion
  757. #region Last
  758. public static TSource Last<TSource> (this IEnumerable<TSource> source)
  759. {
  760. if (source == null)
  761. throw new ArgumentNullException ();
  762. bool noElements = true;
  763. TSource lastElement = default (TSource);
  764. foreach (TSource element in source) {
  765. if (noElements) noElements = false;
  766. lastElement = element;
  767. }
  768. if (!noElements)
  769. return lastElement;
  770. else
  771. throw new InvalidOperationException ();
  772. }
  773. public static TSource Last<TSource> (this IEnumerable<TSource> source,
  774. Func<TSource, bool> predicate)
  775. {
  776. if (source == null || predicate == null)
  777. throw new ArgumentNullException ();
  778. bool noElements = true;
  779. TSource lastElement = default (TSource);
  780. foreach (TSource element in source) {
  781. if (predicate (element)) {
  782. if (noElements) noElements = false;
  783. lastElement = element;
  784. }
  785. }
  786. if (!noElements)
  787. return lastElement;
  788. else
  789. throw new InvalidOperationException ();
  790. }
  791. #endregion
  792. #region LastOrDefault
  793. public static TSource LastOrDefault<TSource> (this IEnumerable<TSource> source)
  794. {
  795. if (source == null)
  796. throw new ArgumentNullException ();
  797. TSource lastElement = default (TSource);
  798. foreach (TSource element in source)
  799. lastElement = element;
  800. return lastElement;
  801. }
  802. public static TSource LastOrDefault<TSource> (this IEnumerable<TSource> source,
  803. Func<TSource, bool> predicate)
  804. {
  805. if (source == null || predicate == null)
  806. throw new ArgumentNullException ();
  807. TSource lastElement = default (TSource);
  808. foreach (TSource element in source) {
  809. if (predicate (element))
  810. lastElement = element;
  811. }
  812. return lastElement;
  813. }
  814. #endregion
  815. #region LongCount
  816. public static long LongCount<TSource> (this IEnumerable<TSource> source)
  817. {
  818. if (source == null)
  819. throw new ArgumentNullException ();
  820. long counter = 0;
  821. foreach (TSource element in source)
  822. counter++;
  823. return counter;
  824. }
  825. public static long LongCount<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> selector)
  826. {
  827. if (source == null || selector == null)
  828. throw new ArgumentNullException ();
  829. long counter = 0;
  830. foreach (TSource element in source)
  831. if (selector (element))
  832. counter++;
  833. return counter;
  834. }
  835. #endregion
  836. #region Max
  837. public static int Max (this IEnumerable<int> source)
  838. {
  839. if (source == null)
  840. throw new ArgumentNullException ();
  841. int maximum = int.MinValue;
  842. int counter = 0;
  843. foreach (int element in source) {
  844. if (element > maximum)
  845. maximum = element;
  846. counter++;
  847. }
  848. if (counter == 0)
  849. throw new InvalidOperationException ();
  850. else
  851. return maximum;
  852. }
  853. public static int? Max (this IEnumerable<int?> source)
  854. {
  855. if (source == null)
  856. throw new ArgumentNullException ();
  857. bool onlyNull = true;
  858. int? maximum = int.MinValue;
  859. foreach (int? element in source) {
  860. if (element.HasValue) {
  861. onlyNull = false;
  862. if (element > maximum)
  863. maximum = element;
  864. }
  865. }
  866. return (onlyNull ? null : maximum);
  867. }
  868. public static long Max (this IEnumerable<long> source)
  869. {
  870. if (source == null)
  871. throw new ArgumentNullException ();
  872. long maximum = long.MinValue;
  873. int counter = 0;
  874. foreach (long element in source) {
  875. if (element > maximum)
  876. maximum = element;
  877. counter++;
  878. }
  879. if (counter == 0)
  880. throw new InvalidOperationException ();
  881. else
  882. return maximum;
  883. }
  884. public static long? Max (this IEnumerable<long?> source)
  885. {
  886. if (source == null)
  887. throw new ArgumentNullException ();
  888. bool onlyNull = true;
  889. long? maximum = long.MinValue;
  890. foreach (long? element in source) {
  891. if (element.HasValue) {
  892. onlyNull = false;
  893. if (element > maximum)
  894. maximum = element;
  895. }
  896. }
  897. return (onlyNull ? null : maximum);
  898. }
  899. public static double Max (this IEnumerable<double> source)
  900. {
  901. if (source == null)
  902. throw new ArgumentNullException ();
  903. double maximum = double.MinValue;
  904. int counter = 0;
  905. foreach (double element in source) {
  906. if (element > maximum)
  907. maximum = element;
  908. counter++;
  909. }
  910. if (counter == 0)
  911. throw new InvalidOperationException ();
  912. else
  913. return maximum;
  914. }
  915. public static double? Max (this IEnumerable<double?> source)
  916. {
  917. if (source == null)
  918. throw new ArgumentNullException ();
  919. bool onlyNull = true;
  920. double? maximum = double.MinValue;
  921. foreach (double? element in source) {
  922. if (element.HasValue) {
  923. onlyNull = false;
  924. if (element > maximum)
  925. maximum = element;
  926. }
  927. }
  928. return (onlyNull ? null : maximum);
  929. }
  930. public static decimal Max (this IEnumerable<decimal> source)
  931. {
  932. if (source == null)
  933. throw new ArgumentNullException ();
  934. decimal maximum = decimal.MinValue;
  935. int counter = 0;
  936. foreach (decimal element in source) {
  937. if (element > maximum)
  938. maximum = element;
  939. counter++;
  940. }
  941. if (counter == 0)
  942. throw new InvalidOperationException ();
  943. else
  944. return maximum;
  945. }
  946. public static decimal? Max (this IEnumerable<decimal?> source)
  947. {
  948. if (source == null)
  949. throw new ArgumentNullException ();
  950. bool onlyNull = true;
  951. decimal? maximum = decimal.MinValue;
  952. foreach (decimal? element in source) {
  953. if (element.HasValue) {
  954. onlyNull = false;
  955. if (element > maximum)
  956. maximum = element;
  957. }
  958. }
  959. return (onlyNull ? null : maximum);
  960. }
  961. public static TSource Max<TSource> (this IEnumerable<TSource> source)
  962. {
  963. if (source == null)
  964. throw new ArgumentNullException ();
  965. bool notAssigned = true;
  966. TSource maximum = default (TSource);
  967. int counter = 0;
  968. foreach (TSource element in source) {
  969. if (notAssigned) {
  970. maximum = element;
  971. notAssigned = false;
  972. } else {
  973. int comparison;
  974. if (element is IComparable<TSource>)
  975. comparison = ((IComparable<TSource>) element).CompareTo (maximum);
  976. else if (element is System.IComparable)
  977. comparison = ((System.IComparable) element).CompareTo (maximum);
  978. else
  979. throw new ArgumentNullException ();
  980. if (comparison > 0)
  981. maximum = element;
  982. }
  983. counter++;
  984. }
  985. if (counter == 0)
  986. throw new InvalidOperationException ();
  987. else
  988. return maximum;
  989. }
  990. public static int Max<TSource> (this IEnumerable<TSource> source,
  991. Func<TSource, int> selector)
  992. {
  993. if (source == null || selector == null)
  994. throw new ArgumentNullException ();
  995. int maximum = int.MinValue;
  996. int counter = 0;
  997. foreach (TSource item in source) {
  998. int element = selector (item);
  999. if (element > maximum)
  1000. maximum = element;
  1001. counter++;
  1002. }
  1003. if (counter == 0)
  1004. throw new InvalidOperationException ();
  1005. else
  1006. return maximum;
  1007. }
  1008. public static int? Max<TSource> (this IEnumerable<TSource> source,
  1009. Func<TSource, int?> selector)
  1010. {
  1011. if (source == null || selector == null)
  1012. throw new ArgumentNullException ();
  1013. bool onlyNull = true;
  1014. int? maximum = int.MinValue;
  1015. foreach (TSource item in source) {
  1016. int? element = selector (item);
  1017. if (element.HasValue) {
  1018. onlyNull = false;
  1019. if (element > maximum)
  1020. maximum = element;
  1021. }
  1022. }
  1023. return (onlyNull ? null : maximum);
  1024. }
  1025. public static long Max<TSource> (this IEnumerable<TSource> source,
  1026. Func<TSource, long> selector)
  1027. {
  1028. if (source == null || selector == null)
  1029. throw new ArgumentNullException ();
  1030. long maximum = long.MinValue;
  1031. int counter = 0;
  1032. foreach (TSource item in source) {
  1033. long element = selector (item);
  1034. if (element > maximum)
  1035. maximum = element;
  1036. counter++;
  1037. }
  1038. if (counter == 0)
  1039. throw new InvalidOperationException ();
  1040. else
  1041. return maximum;
  1042. }
  1043. public static long? Max<TSource> (this IEnumerable<TSource> source,
  1044. Func<TSource, long?> selector)
  1045. {
  1046. if (source == null || selector == null)
  1047. throw new ArgumentNullException ();
  1048. bool onlyNull = true;
  1049. long? maximum = long.MinValue;
  1050. foreach (TSource item in source) {
  1051. long? element = selector (item);
  1052. if (element.HasValue) {
  1053. onlyNull = false;
  1054. if (element > maximum)
  1055. maximum = element;
  1056. }
  1057. }
  1058. return (onlyNull ? null : maximum);
  1059. }
  1060. public static double Max<TSource> (this IEnumerable<TSource> source,
  1061. Func<TSource, double> selector)
  1062. {
  1063. if (source == null || selector == null)
  1064. throw new ArgumentNullException ();
  1065. double maximum = double.MinValue;
  1066. int counter = 0;
  1067. foreach (TSource item in source) {
  1068. double element = selector (item);
  1069. if (element > maximum)
  1070. maximum = element;
  1071. counter++;
  1072. }
  1073. if (counter == 0)
  1074. throw new InvalidOperationException ();
  1075. else
  1076. return maximum;
  1077. }
  1078. public static double? Max<TSource> (this IEnumerable<TSource> source,
  1079. Func<TSource, double?> selector)
  1080. {
  1081. if (source == null || selector == null)
  1082. throw new ArgumentNullException ();
  1083. bool onlyNull = true;
  1084. double? maximum = double.MinValue;
  1085. foreach (TSource item in source) {
  1086. double? element = selector (item);
  1087. if (element.HasValue) {
  1088. onlyNull = false;
  1089. if (element > maximum)
  1090. maximum = element;
  1091. }
  1092. }
  1093. return (onlyNull ? null : maximum);
  1094. }
  1095. public static decimal Max<TSource> (this IEnumerable<TSource> source,
  1096. Func<TSource, decimal> selector)
  1097. {
  1098. if (source == null || selector == null)
  1099. throw new ArgumentNullException ();
  1100. decimal maximum = decimal.MinValue;
  1101. int counter = 0;
  1102. foreach (TSource item in source) {
  1103. decimal element = selector (item);
  1104. if (element > maximum)
  1105. maximum = element;
  1106. counter++;
  1107. }
  1108. if (counter == 0)
  1109. throw new InvalidOperationException ();
  1110. else
  1111. return maximum;
  1112. }
  1113. public static decimal? Max<TSource> (this IEnumerable<TSource> source,
  1114. Func<TSource, decimal?> selector)
  1115. {
  1116. if (source == null || selector == null)
  1117. throw new ArgumentNullException ();
  1118. bool onlyNull = true;
  1119. decimal? maximum = decimal.MinValue;
  1120. foreach (TSource item in source) {
  1121. decimal? element = selector (item);
  1122. if (element.HasValue) {
  1123. onlyNull = false;
  1124. if (element > maximum)
  1125. maximum = element;
  1126. }
  1127. }
  1128. return (onlyNull ? null : maximum);
  1129. }
  1130. public static TResult Max<TSource, TResult> (this IEnumerable<TSource> source,
  1131. Func<TSource, TResult> selector)
  1132. {
  1133. if (source == null || selector == null)
  1134. throw new ArgumentNullException ();
  1135. bool notAssigned = true;
  1136. TResult maximum = default (TResult);
  1137. int counter = 0;
  1138. foreach (TSource item in source) {
  1139. TResult element = selector (item);
  1140. if (notAssigned) {
  1141. maximum = element;
  1142. notAssigned = false;
  1143. } else {
  1144. int comparison;
  1145. if (element is IComparable<TResult>)
  1146. comparison = ((IComparable<TResult>) element).CompareTo (maximum);
  1147. else if (element is System.IComparable)
  1148. comparison = ((System.IComparable) element).CompareTo (maximum);
  1149. else
  1150. throw new ArgumentNullException ();
  1151. if (comparison > 0)
  1152. maximum = element;
  1153. }
  1154. counter++;
  1155. }
  1156. if (counter == 0)
  1157. throw new InvalidOperationException ();
  1158. else
  1159. return maximum;
  1160. }
  1161. #endregion
  1162. #region Min
  1163. public static int Min (this IEnumerable<int> source)
  1164. {
  1165. if (source == null)
  1166. throw new ArgumentNullException ();
  1167. int minimum = int.MaxValue;
  1168. int counter = 0;
  1169. foreach (int element in source) {
  1170. if (element < minimum)
  1171. minimum = element;
  1172. counter++;
  1173. }
  1174. if (counter == 0)
  1175. throw new InvalidOperationException ();
  1176. else
  1177. return minimum;
  1178. }
  1179. public static int? Min (this IEnumerable<int?> source)
  1180. {
  1181. if (source == null)
  1182. throw new ArgumentNullException ();
  1183. bool onlyNull = true;
  1184. int? minimum = int.MaxValue;
  1185. foreach (int? element in source) {
  1186. if (element.HasValue) {
  1187. onlyNull = false;
  1188. if (element < minimum)
  1189. minimum = element;
  1190. }
  1191. }
  1192. return (onlyNull ? null : minimum);
  1193. }
  1194. public static long Min (this IEnumerable<long> source)
  1195. {
  1196. if (source == null)
  1197. throw new ArgumentNullException ();
  1198. long minimum = long.MaxValue;
  1199. int counter = 0;
  1200. foreach (long element in source) {
  1201. if (element < minimum)
  1202. minimum = element;
  1203. counter++;
  1204. }
  1205. if (counter == 0)
  1206. throw new InvalidOperationException ();
  1207. else
  1208. return minimum;
  1209. }
  1210. public static long? Min (this IEnumerable<long?> source)
  1211. {
  1212. if (source == null)
  1213. throw new ArgumentNullException ();
  1214. bool onlyNull = true;
  1215. long? minimum = long.MaxValue;
  1216. foreach (long? element in source) {
  1217. if (element.HasValue) {
  1218. onlyNull = false;
  1219. if (element < minimum)
  1220. minimum = element;
  1221. }
  1222. }
  1223. return (onlyNull ? null : minimum);
  1224. }
  1225. public static double Min (this IEnumerable<double> source)
  1226. {
  1227. if (source == null)
  1228. throw new ArgumentNullException ();
  1229. double minimum = double.MaxValue;
  1230. int counter = 0;
  1231. foreach (double element in source) {
  1232. if (element < minimum)
  1233. minimum = element;
  1234. counter++;
  1235. }
  1236. if (counter == 0)
  1237. throw new InvalidOperationException ();
  1238. else
  1239. return minimum;
  1240. }
  1241. public static double? Min (this IEnumerable<double?> source)
  1242. {
  1243. if (source == null)
  1244. throw new ArgumentNullException ();
  1245. bool onlyNull = true;
  1246. double? minimum = double.MaxValue;
  1247. foreach (double? element in source) {
  1248. if (element.HasValue) {
  1249. onlyNull = false;
  1250. if (element < minimum)
  1251. minimum = element;
  1252. }
  1253. }
  1254. return (onlyNull ? null : minimum);
  1255. }
  1256. public static decimal Min (this IEnumerable<decimal> source)
  1257. {
  1258. if (source == null)
  1259. throw new ArgumentNullException ();
  1260. decimal minimum = decimal.MaxValue;
  1261. int counter = 0;
  1262. foreach (decimal element in source) {
  1263. if (element < minimum)
  1264. minimum = element;
  1265. counter++;
  1266. }
  1267. if (counter == 0)
  1268. throw new InvalidOperationException ();
  1269. else
  1270. return minimum;
  1271. }
  1272. public static decimal? Min (this IEnumerable<decimal?> source)
  1273. {
  1274. if (source == null)
  1275. throw new ArgumentNullException ();
  1276. bool onlyNull = true;
  1277. decimal? minimum = decimal.MaxValue;
  1278. foreach (decimal? element in source) {
  1279. if (element.HasValue) {
  1280. onlyNull = false;
  1281. if (element < minimum)
  1282. minimum = element;
  1283. }
  1284. }
  1285. return (onlyNull ? null : minimum);
  1286. }
  1287. public static TSource Min<TSource> (this IEnumerable<TSource> source)
  1288. {
  1289. if (source == null)
  1290. throw new ArgumentNullException ();
  1291. bool notAssigned = true;
  1292. TSource minimum = default (TSource);
  1293. int counter = 0;
  1294. foreach (TSource element in source) {
  1295. if (notAssigned) {
  1296. minimum = element;
  1297. notAssigned = false;
  1298. } else {
  1299. int comparison;
  1300. if (element is IComparable<TSource>)
  1301. comparison = ((IComparable<TSource>) element).CompareTo (minimum);
  1302. else if (element is System.IComparable)
  1303. comparison = ((System.IComparable) element).CompareTo (minimum);
  1304. else
  1305. throw new ArgumentNullException ();
  1306. if (comparison < 0)
  1307. minimum = element;
  1308. }
  1309. counter++;
  1310. }
  1311. if (counter == 0)
  1312. throw new InvalidOperationException ();
  1313. else
  1314. return minimum;
  1315. }
  1316. public static int Min<TSource> (this IEnumerable<TSource> source,
  1317. Func<TSource, int> selector)
  1318. {
  1319. if (source == null || selector == null)
  1320. throw new ArgumentNullException ();
  1321. int minimum = int.MaxValue;
  1322. int counter = 0;
  1323. foreach (TSource item in source) {
  1324. int element = selector (item);
  1325. if (element < minimum)
  1326. minimum = element;
  1327. counter++;
  1328. }
  1329. if (counter == 0)
  1330. throw new InvalidOperationException ();
  1331. else
  1332. return minimum;
  1333. }
  1334. public static int? Min<TSource> (this IEnumerable<TSource> source,
  1335. Func<TSource, int?> selector)
  1336. {
  1337. if (source == null || selector == null)
  1338. throw new ArgumentNullException ();
  1339. bool onlyNull = true;
  1340. int? minimum = int.MaxValue;
  1341. foreach (TSource item in source) {
  1342. int? element = selector (item);
  1343. if (element.HasValue) {
  1344. onlyNull = false;
  1345. if (element < minimum)
  1346. minimum = element;
  1347. }
  1348. }
  1349. return (onlyNull ? null : minimum);
  1350. }
  1351. public static long Min<TSource> (this IEnumerable<TSource> source,
  1352. Func<TSource, long> selector)
  1353. {
  1354. if (source == null || selector == null)
  1355. throw new ArgumentNullException ();
  1356. long minimum = long.MaxValue;
  1357. int counter = 0;
  1358. foreach (TSource item in source) {
  1359. long element = selector (item);
  1360. if (element < minimum)
  1361. minimum = element;
  1362. counter++;
  1363. }
  1364. if (counter == 0)
  1365. throw new InvalidOperationException ();
  1366. else
  1367. return minimum;
  1368. }
  1369. public static long? Min<TSource> (this IEnumerable<TSource> source,
  1370. Func<TSource, long?> selector)
  1371. {
  1372. if (source == null || selector == null)
  1373. throw new ArgumentNullException ();
  1374. bool onlyNull = true;
  1375. long? minimum = long.MaxValue;
  1376. foreach (TSource item in source) {
  1377. long? element = selector (item);
  1378. if (element.HasValue) {
  1379. onlyNull = false;
  1380. if (element < minimum)
  1381. minimum = element;
  1382. }
  1383. }
  1384. return (onlyNull ? null : minimum);
  1385. }
  1386. public static double Min<TSource> (this IEnumerable<TSource> source,
  1387. Func<TSource, double> selector)
  1388. {
  1389. if (source == null || selector == null)
  1390. throw new ArgumentNullException ();
  1391. double minimum = double.MaxValue;
  1392. int counter = 0;
  1393. foreach (TSource item in source) {
  1394. double element = selector (item);
  1395. if (element < minimum)
  1396. minimum = element;
  1397. counter++;
  1398. }
  1399. if (counter == 0)
  1400. throw new InvalidOperationException ();
  1401. else
  1402. return minimum;
  1403. }
  1404. public static double? Min<TSource> (this IEnumerable<TSource> source,
  1405. Func<TSource, double?> selector)
  1406. {
  1407. if (source == null || selector == null)
  1408. throw new ArgumentNullException ();
  1409. bool onlyNull = true;
  1410. double? minimum = double.MaxValue;
  1411. foreach (TSource item in source) {
  1412. double? element = selector (item);
  1413. if (element.HasValue) {
  1414. onlyNull = false;
  1415. if (element < minimum)
  1416. minimum = element;
  1417. }
  1418. }
  1419. return (onlyNull ? null : minimum);
  1420. }
  1421. public static decimal Min<TSource> (this IEnumerable<TSource> source,
  1422. Func<TSource, decimal> selector)
  1423. {
  1424. if (source == null || selector == null)
  1425. throw new ArgumentNullException ();
  1426. decimal minimum = decimal.MaxValue;
  1427. int counter = 0;
  1428. foreach (TSource item in source) {
  1429. decimal element = selector (item);
  1430. if (element < minimum)
  1431. minimum = element;
  1432. counter++;
  1433. }
  1434. if (counter == 0)
  1435. throw new InvalidOperationException ();
  1436. else
  1437. return minimum;
  1438. }
  1439. public static decimal? Min<TSource> (this IEnumerable<TSource> source,
  1440. Func<TSource, decimal?> selector)
  1441. {
  1442. if (source == null || selector == null)
  1443. throw new ArgumentNullException ();
  1444. bool onlyNull = true;
  1445. decimal? minimum = decimal.MaxValue;
  1446. foreach (TSource item in source) {
  1447. decimal? element = selector (item);
  1448. if (element.HasValue) {
  1449. onlyNull = false;
  1450. if (element < minimum)
  1451. minimum = element;
  1452. }
  1453. }
  1454. return (onlyNull ? null : minimum);
  1455. }
  1456. public static TResult Min<TSource, TResult> (this IEnumerable<TSource> source,
  1457. Func<TSource, TResult> selector)
  1458. {
  1459. if (source == null || selector == null)
  1460. throw new ArgumentNullException ();
  1461. bool notAssigned = true;
  1462. TResult minimum = default (TResult);
  1463. int counter = 0;
  1464. foreach (TSource item in source) {
  1465. TResult element = selector (item);
  1466. if (notAssigned) {
  1467. minimum = element;
  1468. notAssigned = false;
  1469. } else {
  1470. int comparison;
  1471. if (element is IComparable<TResult>)
  1472. comparison = ((IComparable<TResult>) element).CompareTo (minimum);
  1473. else if (element is System.IComparable)
  1474. comparison = ((System.IComparable) element).CompareTo (minimum);
  1475. else
  1476. throw new ArgumentNullException ();
  1477. if (comparison < 0)
  1478. minimum = element;
  1479. }
  1480. counter++;
  1481. }
  1482. if (counter == 0)
  1483. throw new InvalidOperationException ();
  1484. else
  1485. return minimum;
  1486. }
  1487. #endregion
  1488. #region OfType
  1489. public static IEnumerable<TResult> OfType<TResult> (this IEnumerable source)
  1490. {
  1491. if (source == null)
  1492. throw new ArgumentNullException ();
  1493. foreach (object element in source)
  1494. if (element is TResult)
  1495. yield return (TResult) element;
  1496. }
  1497. #endregion
  1498. #region OrderBy
  1499. public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey> (this IEnumerable<TSource> source,
  1500. Func<TSource, TKey> keySelector)
  1501. {
  1502. return OrderBy<TSource, TKey> (source, keySelector, null);
  1503. }
  1504. public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey> (this IEnumerable<TSource> source,
  1505. Func<TSource, TKey> keySelector,
  1506. IComparer<TKey> comparer)
  1507. {
  1508. if (source == null || keySelector == null)
  1509. throw new ArgumentNullException ();
  1510. return new InternalOrderedSequence<TSource, TKey> (
  1511. source, keySelector, comparer, false);
  1512. }
  1513. #endregion
  1514. #region OrderByDescending
  1515. public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey> (this IEnumerable<TSource> source,
  1516. Func<TSource, TKey> keySelector)
  1517. {
  1518. return OrderByDescending<TSource, TKey> (source, keySelector, null);
  1519. }
  1520. public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey> (this IEnumerable<TSource> source,
  1521. Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
  1522. {
  1523. if (source == null || keySelector == null)
  1524. throw new ArgumentNullException ();
  1525. return new InternalOrderedSequence<TSource, TKey> (
  1526. source, keySelector, comparer, true);
  1527. }
  1528. #endregion
  1529. #region Range
  1530. public static IEnumerable<int> Range (int start, int count)
  1531. {
  1532. if (count < 0 || (start + count - 1) > int.MaxValue)
  1533. throw new ArgumentOutOfRangeException ();
  1534. for (int i = start; i < (start + count - 1); i++)
  1535. yield return i;
  1536. }
  1537. #endregion
  1538. #region Repeat
  1539. public static IEnumerable<TResult> Repeat<TResult> (TResult element, int count)
  1540. {
  1541. if (count < 0)
  1542. throw new ArgumentOutOfRangeException ();
  1543. for (int i = 0; i < count; i++)
  1544. yield return element;
  1545. }
  1546. #endregion
  1547. #region Reverse
  1548. public static IEnumerable<TSource> Reverse<TSource> (this IEnumerable<TSource> source)
  1549. {
  1550. if (source == null)
  1551. throw new ArgumentNullException ();
  1552. List<TSource> list = new List<TSource> (source);
  1553. list.Reverse ();
  1554. return list;
  1555. }
  1556. #endregion
  1557. #region Select
  1558. public static IEnumerable<TResult> Select<TSource, TResult> (this IEnumerable<TSource> source,
  1559. Func<TSource, TResult> selector)
  1560. {
  1561. if (source == null || selector == null)
  1562. throw new ArgumentNullException ();
  1563. foreach (TSource element in source)
  1564. yield return selector (element);
  1565. }
  1566. public static IEnumerable<TResult> Select<TSource, TResult> (this IEnumerable<TSource> source,
  1567. Func<TSource, int, TResult> selector)
  1568. {
  1569. if (source == null || selector == null)
  1570. throw new ArgumentNullException ();
  1571. int counter = 0;
  1572. foreach (TSource element in source) {
  1573. yield return selector (element, counter);
  1574. counter++;
  1575. }
  1576. }
  1577. #endregion
  1578. #region SelectMany
  1579. public static IEnumerable<TResult> SelectMany<TSource, TResult> (this IEnumerable<TSource> source,
  1580. Func<TSource, IEnumerable<TResult>> selector)
  1581. {
  1582. if (source == null || selector == null)
  1583. throw new ArgumentNullException ();
  1584. foreach (TSource element in source)
  1585. foreach (TResult item in selector (element))
  1586. yield return item;
  1587. }
  1588. public static IEnumerable<TResult> SelectMany<TSource, TResult> (this IEnumerable<TSource> source,
  1589. Func<TSource, int, IEnumerable<TResult>> selector)
  1590. {
  1591. if (source == null || selector == null)
  1592. throw new ArgumentNullException ();
  1593. int counter = 0;
  1594. foreach (TSource element in source) {
  1595. foreach (TResult item in selector (element, counter++))
  1596. yield return item;
  1597. counter++;
  1598. }
  1599. }
  1600. public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult> (this IEnumerable<TSource> source,
  1601. Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> selector)
  1602. {
  1603. if (source == null || collectionSelector == null || selector == null)
  1604. throw new ArgumentNullException ();
  1605. foreach (TSource element in source)
  1606. foreach (TCollection collection in collectionSelector (element))
  1607. yield return selector (element, collection);
  1608. }
  1609. public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult> (this IEnumerable<TSource> source,
  1610. Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> selector)
  1611. {
  1612. if (source == null || collectionSelector == null || selector == null)
  1613. throw new ArgumentNullException ();
  1614. int counter = 0;
  1615. foreach (TSource element in source)
  1616. foreach (TCollection collection in collectionSelector (element, counter++))
  1617. yield return selector (element, collection);
  1618. }
  1619. #endregion
  1620. #region Single
  1621. public static TSource Single<TSource> (this IEnumerable<TSource> source)
  1622. {
  1623. if (source == null)
  1624. throw new ArgumentNullException ();
  1625. bool otherElement = false;
  1626. TSource singleElement = default (TSource);
  1627. foreach (TSource element in source) {
  1628. if (otherElement) throw new InvalidOperationException ();
  1629. if (!otherElement) otherElement = true;
  1630. singleElement = element;
  1631. }
  1632. if (otherElement)
  1633. return singleElement;
  1634. else
  1635. throw new InvalidOperationException ();
  1636. }
  1637. public static TSource Single<TSource> (this IEnumerable<TSource> source,
  1638. Func<TSource, bool> predicate)
  1639. {
  1640. if (source == null || predicate == null)
  1641. throw new ArgumentNullException ();
  1642. bool otherElement = false;
  1643. TSource singleElement = default (TSource);
  1644. foreach (TSource element in source) {
  1645. if (predicate (element)) {
  1646. if (otherElement) throw new InvalidOperationException ();
  1647. if (!otherElement) otherElement = true;
  1648. singleElement = element;
  1649. }
  1650. }
  1651. if (otherElement)
  1652. return singleElement;
  1653. else
  1654. throw new InvalidOperationException ();
  1655. }
  1656. #endregion
  1657. #region SingleOrDefault
  1658. public static TSource SingleOrDefault<TSource> (this IEnumerable<TSource> source)
  1659. {
  1660. if (source == null)
  1661. throw new ArgumentNullException ();
  1662. bool otherElement = false;
  1663. TSource singleElement = default (TSource);
  1664. foreach (TSource element in source) {
  1665. if (otherElement) throw new InvalidOperationException ();
  1666. if (!otherElement) otherElement = true;
  1667. singleElement = element;
  1668. }
  1669. return singleElement;
  1670. }
  1671. public static TSource SingleOrDefault<TSource> (this IEnumerable<TSource> source,
  1672. Func<TSource, bool> predicate)
  1673. {
  1674. if (source == null || predicate == null)
  1675. throw new ArgumentNullException ();
  1676. bool otherElement = false;
  1677. TSource singleElement = default (TSource);
  1678. foreach (TSource element in source) {
  1679. if (predicate (element)) {
  1680. if (otherElement) throw new InvalidOperationException ();
  1681. if (!otherElement) otherElement = true;
  1682. singleElement = element;
  1683. }
  1684. }
  1685. return singleElement;
  1686. }
  1687. #endregion
  1688. #region Skip
  1689. public static IEnumerable<TSource> Skip<TSource> (this IEnumerable<TSource> source, int count)
  1690. {
  1691. if (source == null)
  1692. throw new NotSupportedException ();
  1693. int i = 0;
  1694. foreach (TSource e in source) {
  1695. if (++i < count)
  1696. continue;
  1697. yield return e;
  1698. }
  1699. }
  1700. #endregion
  1701. #region SkipWhile
  1702. public static IEnumerable<TSource> SkipWhile<TSource> (
  1703. this IEnumerable<TSource> source,
  1704. Func<TSource, bool> predicate)
  1705. {
  1706. if (source == null || predicate == null)
  1707. throw new ArgumentNullException ();
  1708. bool yield = false;
  1709. foreach (TSource element in source) {
  1710. if (yield)
  1711. yield return element;
  1712. else
  1713. if (!predicate (element)) {
  1714. yield return element;
  1715. yield = true;
  1716. }
  1717. }
  1718. }
  1719. public static IEnumerable<TSource> SkipWhile<TSource> (this IEnumerable<TSource> source,
  1720. Func<TSource, int, bool> predicate)
  1721. {
  1722. if (source == null || predicate == null)
  1723. throw new ArgumentNullException ();
  1724. int counter = 0;
  1725. bool yield = false;
  1726. foreach (TSource element in source) {
  1727. if (yield)
  1728. yield return element;
  1729. else
  1730. if (!predicate (element, counter)) {
  1731. yield return element;
  1732. yield = true;
  1733. }
  1734. counter++;
  1735. }
  1736. }
  1737. #endregion
  1738. #region Sum
  1739. public static int Sum (this IEnumerable<int> source)
  1740. {
  1741. if (source == null)
  1742. throw new ArgumentNullException ("source");
  1743. int sum = 0;
  1744. foreach (int element in source)
  1745. sum += element;
  1746. return sum;
  1747. }
  1748. public static int Sum<TSource> (this IEnumerable<TSource> source, Func<TSource, int> selector)
  1749. {
  1750. if (source == null || selector == null)
  1751. throw new ArgumentNullException ();
  1752. int sum = 0;
  1753. foreach (TSource element in source)
  1754. sum += selector (element);
  1755. return sum;
  1756. }
  1757. public static int? Sum (this IEnumerable<int?> source)
  1758. {
  1759. if (source == null)
  1760. throw new ArgumentNullException ();
  1761. int? sum = 0;
  1762. foreach (int? element in source)
  1763. if (element.HasValue)
  1764. sum += element.Value;
  1765. return sum;
  1766. }
  1767. public static int? Sum<TSource> (this IEnumerable<TSource> source, Func<TSource, int?> selector)
  1768. {
  1769. if (source == null || selector == null)
  1770. throw new ArgumentNullException ();
  1771. int? sum = 0;
  1772. foreach (TSource element in source) {
  1773. int? item = selector (element);
  1774. if (item.HasValue)
  1775. sum += item.Value;
  1776. }
  1777. return sum;
  1778. }
  1779. public static long Sum (this IEnumerable<long> source)
  1780. {
  1781. if (source == null)
  1782. throw new ArgumentNullException ();
  1783. long sum = 0;
  1784. foreach (long element in source)
  1785. sum += element;
  1786. return sum;
  1787. }
  1788. public static long Sum<TSource> (this IEnumerable<TSource> source, Func<TSource, long> selector)
  1789. {
  1790. if (source == null || selector == null)
  1791. throw new ArgumentNullException ();
  1792. long sum = 0;
  1793. foreach (TSource element in source)
  1794. sum += selector (element);
  1795. return sum;
  1796. }
  1797. public static long? Sum (this IEnumerable<long?> source)
  1798. {
  1799. if (source == null)
  1800. throw new ArgumentNullException ();
  1801. long? sum = 0;
  1802. foreach (long? element in source)
  1803. if (element.HasValue)
  1804. sum += element.Value;
  1805. return sum;
  1806. }
  1807. public static long? Sum<TSource> (this IEnumerable<TSource> source, Func<TSource, long?> selector)
  1808. {
  1809. if (source == null || selector == null)
  1810. throw new ArgumentNullException ();
  1811. long? sum = 0;
  1812. foreach (TSource element in source) {
  1813. long? item = selector (element);
  1814. if (item.HasValue)
  1815. sum += item.Value;
  1816. }
  1817. return sum;
  1818. }
  1819. public static double Sum (this IEnumerable<double> source)
  1820. {
  1821. if (source == null)
  1822. throw new ArgumentNullException ();
  1823. double sum = 0;
  1824. foreach (double element in source)
  1825. sum += element;
  1826. return sum;
  1827. }
  1828. public static double Sum<TSource> (this IEnumerable<TSource> source, Func<TSource, double> selector)
  1829. {
  1830. if (source == null || selector == null)
  1831. throw new ArgumentNullException ();
  1832. double sum = 0;
  1833. foreach (TSource element in source)
  1834. sum += selector (element);
  1835. return sum;
  1836. }
  1837. public static double? Sum (this IEnumerable<double?> source)
  1838. {
  1839. if (source == null)
  1840. throw new ArgumentNullException ();
  1841. double? sum = 0;
  1842. foreach (double? element in source)
  1843. if (element.HasValue)
  1844. sum += element.Value;
  1845. return sum;
  1846. }
  1847. public static double? Sum<TSource> (this IEnumerable<TSource> source, Func<TSource, double?> selector)
  1848. {
  1849. if (source == null || selector == null)
  1850. throw new ArgumentNullException ();
  1851. double? sum = 0;
  1852. foreach (TSource element in source) {
  1853. double? item = selector (element);
  1854. if (item.HasValue)
  1855. sum += item.Value;
  1856. }
  1857. return sum;
  1858. }
  1859. public static decimal Sum (this IEnumerable<decimal> source)
  1860. {
  1861. if (source == null)
  1862. throw new ArgumentNullException ();
  1863. decimal sum = 0;
  1864. foreach (decimal element in source)
  1865. sum += element;
  1866. return sum;
  1867. }
  1868. public static decimal Sum<TSource> (this IEnumerable<TSource> source, Func<TSource, decimal> selector)
  1869. {
  1870. if (source == null || selector == null)
  1871. throw new ArgumentNullException ();
  1872. decimal sum = 0;
  1873. foreach (TSource element in source)
  1874. sum += selector (element);
  1875. return sum;
  1876. }
  1877. public static decimal? Sum (this IEnumerable<decimal?> source)
  1878. {
  1879. if (source == null)
  1880. throw new ArgumentNullException ();
  1881. decimal? sum = 0;
  1882. foreach (decimal? element in source)
  1883. if (element.HasValue)
  1884. sum += element.Value;
  1885. return sum;
  1886. }
  1887. public static decimal? Sum<TSource> (this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
  1888. {
  1889. if (source == null || selector == null)
  1890. throw new ArgumentNullException ();
  1891. decimal? sum = 0;
  1892. foreach (TSource element in source) {
  1893. decimal? item = selector (element);
  1894. if (item.HasValue)
  1895. sum += item.Value;
  1896. }
  1897. return sum;
  1898. }
  1899. #endregion
  1900. #region Take
  1901. public static IEnumerable<TSource> Take<TSource> (this IEnumerable<TSource> source, int count)
  1902. {
  1903. if (source == null)
  1904. throw new ArgumentNullException ();
  1905. if (count <= 0)
  1906. yield break;
  1907. else {
  1908. int counter = 0;
  1909. foreach (TSource element in source) {
  1910. yield return element;
  1911. counter++;
  1912. if (counter == count)
  1913. yield break;
  1914. }
  1915. }
  1916. }
  1917. #endregion
  1918. #region TakeWhile
  1919. public static IEnumerable<TSource> TakeWhile<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate)
  1920. {
  1921. if (source == null || predicate == null)
  1922. throw new ArgumentNullException ();
  1923. foreach (TSource element in source) {
  1924. if (predicate (element))
  1925. yield return element;
  1926. else
  1927. yield break;
  1928. }
  1929. }
  1930. public static IEnumerable<TSource> TakeWhile<TSource> (this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
  1931. {
  1932. if (source == null || predicate == null)
  1933. throw new ArgumentNullException ();
  1934. int counter = 0;
  1935. foreach (TSource element in source) {
  1936. if (predicate (element, counter))
  1937. yield return element;
  1938. else
  1939. yield break;
  1940. counter++;
  1941. }
  1942. }
  1943. #endregion
  1944. #region ThenBy
  1945. public static IOrderedEnumerable<TSource> ThenBy<TSource, TKey> (this IOrderedEnumerable<TSource> source, Func<TSource, TKey> keySelector)
  1946. {
  1947. return ThenBy<TSource, TKey> (source, keySelector, null);
  1948. }
  1949. public static IOrderedEnumerable<TSource> ThenBy<TSource, TKey> (this IOrderedEnumerable<TSource> source,
  1950. Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
  1951. {
  1952. if (source == null || keySelector == null)
  1953. throw new ArgumentNullException ();
  1954. return source.CreateOrderedEnumerable (keySelector, comparer, false);
  1955. }
  1956. #endregion
  1957. #region ThenByDescending
  1958. public static IOrderedEnumerable<TSource> ThenByDescending<TSource, TKey> (this IOrderedEnumerable<TSource> source,
  1959. Func<TSource, TKey> keySelector)
  1960. {
  1961. return ThenByDescending<TSource, TKey> (source, keySelector, null);
  1962. }
  1963. public static IOrderedEnumerable<TSource> ThenByDescending<TSource, TKey> (this IOrderedEnumerable<TSource> source,
  1964. Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
  1965. {
  1966. if (source == null || keySelector == null)
  1967. throw new ArgumentNullException ();
  1968. return source.CreateOrderedEnumerable (keySelector, comparer, true);
  1969. }
  1970. #endregion
  1971. #region ToArray
  1972. public static TSource [] ToArray<TSource> (this IEnumerable<TSource> source)
  1973. {
  1974. if (source == null)
  1975. throw new ArgumentNullException ();
  1976. List<TSource> list = new List<TSource> (source);
  1977. return list.ToArray ();
  1978. }
  1979. #endregion
  1980. #region ToDictionary
  1981. public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
  1982. {
  1983. return ToDictionary<TSource, TKey, TElement> (source, keySelector, elementSelector, null);
  1984. }
  1985. public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
  1986. {
  1987. if (source == null)
  1988. throw new ArgumentNullException ("source");
  1989. if (keySelector == null)
  1990. throw new ArgumentNullException ("keySelector");
  1991. if (elementSelector == null)
  1992. throw new ArgumentNullException ("elementSelector");
  1993. Dictionary<TKey, TElement> dict = new Dictionary<TKey, TElement> (comparer);
  1994. foreach (TSource e in source) {
  1995. dict.Add (keySelector (e), elementSelector (e));
  1996. }
  1997. return dict;
  1998. }
  1999. #endregion
  2000. #region ToList
  2001. public static List<TSource> ToList<TSource> (this IEnumerable<TSource> source)
  2002. {
  2003. if (source == null)
  2004. throw new ArgumentNullException ("source");
  2005. return new List<TSource> (source);
  2006. }
  2007. #endregion
  2008. #region ToLookup
  2009. public static Lookup<TKey, TSource> ToLookup<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
  2010. {
  2011. return ToLookup<TSource, TKey> (source, keySelector, null);
  2012. }
  2013. public static Lookup<TKey, TSource> ToLookup<TSource, TKey> (this IEnumerable<TSource> source,
  2014. Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
  2015. {
  2016. if (source == null || keySelector == null)
  2017. throw new ArgumentNullException ();
  2018. Dictionary<TKey, List<TSource>> dictionary = new Dictionary<TKey, List<TSource>> (comparer ?? EqualityComparer<TKey>.Default);
  2019. foreach (TSource element in source) {
  2020. TKey key = keySelector (element);
  2021. if (key == null)
  2022. throw new ArgumentNullException ();
  2023. if (!dictionary.ContainsKey (key))
  2024. dictionary.Add (key, new List<TSource> ());
  2025. dictionary [key].Add (element);
  2026. }
  2027. return new Lookup<TKey, TSource> (dictionary);
  2028. }
  2029. public static Lookup<TKey, TElement> ToLookup<TSource, TKey, TElement> (this IEnumerable<TSource> source,
  2030. Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
  2031. {
  2032. return ToLookup<TSource, TKey, TElement> (source, keySelector, elementSelector, null);
  2033. }
  2034. public static Lookup<TKey, TElement> ToLookup<TSource, TKey, TElement> (this IEnumerable<TSource> source,
  2035. Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
  2036. {
  2037. if (source == null || keySelector == null || elementSelector == null)
  2038. throw new ArgumentNullException ();
  2039. Dictionary<TKey, List<TElement>> dictionary = new Dictionary<TKey, List<TElement>> (comparer ?? EqualityComparer<TKey>.Default);
  2040. foreach (TSource element in source) {
  2041. TKey key = keySelector (element);
  2042. if (key == null)
  2043. throw new ArgumentNullException ();
  2044. if (!dictionary.ContainsKey (key))
  2045. dictionary.Add (key, new List<TElement> ());
  2046. dictionary [key].Add (elementSelector (element));
  2047. }
  2048. return new Lookup<TKey, TElement> (dictionary);
  2049. }
  2050. #endregion
  2051. #region ToSequence
  2052. public static IEnumerable<T> ToSequence<T> (this IEnumerable<T> source)
  2053. {
  2054. return (IEnumerable<T>) source;
  2055. }
  2056. #endregion
  2057. #region Union
  2058. public static IEnumerable<TSource> Union<TSource> (this IEnumerable<TSource> first, IEnumerable<TSource> second)
  2059. {
  2060. if (first == null || second == null)
  2061. throw new ArgumentNullException ();
  2062. List<TSource> items = new List<TSource> ();
  2063. foreach (TSource element in first) {
  2064. if (IndexOf (items, element) == -1) {
  2065. items.Add (element);
  2066. yield return element;
  2067. }
  2068. }
  2069. foreach (TSource element in second) {
  2070. if (IndexOf (items, element) == -1) {
  2071. items.Add (element);
  2072. yield return element;
  2073. }
  2074. }
  2075. }
  2076. #endregion
  2077. #region Where
  2078. public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source,
  2079. Func<TSource, bool> predicate)
  2080. {
  2081. if (source == null || predicate == null)
  2082. throw new ArgumentNullException ();
  2083. foreach (TSource element in source)
  2084. if (predicate (element))
  2085. yield return element;
  2086. }
  2087. public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source,
  2088. Func<TSource, int, bool> predicate)
  2089. {
  2090. if (source == null || predicate == null)
  2091. throw new ArgumentNullException ();
  2092. int counter = 0;
  2093. foreach (TSource element in source) {
  2094. if (predicate (element, counter))
  2095. yield return element;
  2096. counter++;
  2097. }
  2098. }
  2099. #endregion
  2100. // These methods are not included in the
  2101. // .NET Standard Query Operators Specification,
  2102. // but they provide additional useful commands
  2103. #region Compare
  2104. private static bool Equals<T> (T first, T second)
  2105. {
  2106. // Mostly, values in Enumerable<T>
  2107. // sequences need to be compared using
  2108. // Equals and GetHashCode
  2109. if (first == null || second == null)
  2110. return (first == null && second == null);
  2111. else
  2112. return ((first.Equals (second) ||
  2113. first.GetHashCode () == second.GetHashCode ()));
  2114. }
  2115. #endregion
  2116. #region IndexOf
  2117. static int IndexOf<T> (this IEnumerable<T> source, T item, IEqualityComparer<T> comparer)
  2118. {
  2119. if (comparer == null)
  2120. comparer = EqualityComparer<T>.Default;
  2121. int counter = 0;
  2122. foreach (T element in source) {
  2123. if (comparer.Equals (element, item))
  2124. return counter;
  2125. counter++;
  2126. }
  2127. // The item was not found
  2128. return -1;
  2129. }
  2130. static int IndexOf<T> (this IEnumerable<T> source, T item)
  2131. {
  2132. return IndexOf<T> (source, item, null);
  2133. }
  2134. #endregion
  2135. #region ToReadOnlyCollection
  2136. internal static ReadOnlyCollection<TSource> ToReadOnlyCollection<TSource> (IEnumerable<TSource> source)
  2137. {
  2138. if (source == null)
  2139. return new ReadOnlyCollection<TSource> (new List<TSource> ());
  2140. if (typeof (ReadOnlyCollection<TSource>).IsInstanceOfType (source))
  2141. return source as ReadOnlyCollection<TSource>;
  2142. return new ReadOnlyCollection<TSource> (ToArray<TSource> (source));
  2143. }
  2144. #endregion
  2145. }
  2146. }