Tuple.cs 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. // See the LICENSE file in the project root for more information.
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.Runtime.CompilerServices;
  8. using System.Text;
  9. //
  10. // Note: F# compiler depends on the exact tuple hashing algorithm. Do not ever change it.
  11. //
  12. namespace System
  13. {
  14. /// <summary>
  15. /// Helper so we can call some tuple methods recursively without knowing the underlying types.
  16. /// </summary>
  17. internal interface ITupleInternal : ITuple
  18. {
  19. string ToString(StringBuilder sb);
  20. int GetHashCode(IEqualityComparer comparer);
  21. }
  22. public static class Tuple
  23. {
  24. public static Tuple<T1> Create<T1>(T1 item1)
  25. {
  26. return new Tuple<T1>(item1);
  27. }
  28. public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
  29. {
  30. return new Tuple<T1, T2>(item1, item2);
  31. }
  32. public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
  33. {
  34. return new Tuple<T1, T2, T3>(item1, item2, item3);
  35. }
  36. public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)
  37. {
  38. return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);
  39. }
  40. public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
  41. {
  42. return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);
  43. }
  44. public static Tuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
  45. {
  46. return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);
  47. }
  48. public static Tuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
  49. {
  50. return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);
  51. }
  52. public static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
  53. {
  54. return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));
  55. }
  56. // From System.Web.Util.HashCodeCombiner
  57. internal static int CombineHashCodes(int h1, int h2)
  58. {
  59. return (((h1 << 5) + h1) ^ h2);
  60. }
  61. internal static int CombineHashCodes(int h1, int h2, int h3)
  62. {
  63. return CombineHashCodes(CombineHashCodes(h1, h2), h3);
  64. }
  65. internal static int CombineHashCodes(int h1, int h2, int h3, int h4)
  66. {
  67. return CombineHashCodes(CombineHashCodes(h1, h2), CombineHashCodes(h3, h4));
  68. }
  69. internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5)
  70. {
  71. return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), h5);
  72. }
  73. internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6)
  74. {
  75. return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6));
  76. }
  77. internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7)
  78. {
  79. return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7));
  80. }
  81. internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7, int h8)
  82. {
  83. return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7, h8));
  84. }
  85. }
  86. [Serializable]
  87. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  88. public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  89. {
  90. private readonly T1 m_Item1; // Do not rename (binary serialization)
  91. public T1 Item1 { get { return m_Item1; } }
  92. public Tuple(T1 item1)
  93. {
  94. m_Item1 = item1;
  95. }
  96. public override bool Equals(object obj)
  97. {
  98. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
  99. }
  100. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  101. {
  102. if (other == null) return false;
  103. Tuple<T1> objTuple = other as Tuple<T1>;
  104. if (objTuple == null)
  105. {
  106. return false;
  107. }
  108. return comparer.Equals(m_Item1, objTuple.m_Item1);
  109. }
  110. int IComparable.CompareTo(object obj)
  111. {
  112. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  113. }
  114. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  115. {
  116. if (other == null) return 1;
  117. Tuple<T1> objTuple = other as Tuple<T1>;
  118. if (objTuple == null)
  119. {
  120. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  121. }
  122. return comparer.Compare(m_Item1, objTuple.m_Item1);
  123. }
  124. public override int GetHashCode()
  125. {
  126. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  127. }
  128. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  129. {
  130. return comparer.GetHashCode(m_Item1);
  131. }
  132. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  133. {
  134. return ((IStructuralEquatable)this).GetHashCode(comparer);
  135. }
  136. public override string ToString()
  137. {
  138. StringBuilder sb = new StringBuilder();
  139. sb.Append('(');
  140. return ((ITupleInternal)this).ToString(sb);
  141. }
  142. string ITupleInternal.ToString(StringBuilder sb)
  143. {
  144. sb.Append(m_Item1);
  145. sb.Append(')');
  146. return sb.ToString();
  147. }
  148. /// <summary>
  149. /// The number of positions in this data structure.
  150. /// </summary>
  151. int ITuple.Length => 1;
  152. /// <summary>
  153. /// Get the element at position <param name="index"/>.
  154. /// </summary>
  155. object ITuple.this[int index]
  156. {
  157. get
  158. {
  159. if (index != 0)
  160. {
  161. throw new IndexOutOfRangeException();
  162. }
  163. return Item1;
  164. }
  165. }
  166. }
  167. [Serializable]
  168. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  169. public class Tuple<T1, T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  170. {
  171. private readonly T1 m_Item1; // Do not rename (binary serialization)
  172. private readonly T2 m_Item2; // Do not rename (binary serialization)
  173. public T1 Item1 { get { return m_Item1; } }
  174. public T2 Item2 { get { return m_Item2; } }
  175. public Tuple(T1 item1, T2 item2)
  176. {
  177. m_Item1 = item1;
  178. m_Item2 = item2;
  179. }
  180. public override bool Equals(object obj)
  181. {
  182. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  183. }
  184. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  185. {
  186. if (other == null) return false;
  187. Tuple<T1, T2> objTuple = other as Tuple<T1, T2>;
  188. if (objTuple == null)
  189. {
  190. return false;
  191. }
  192. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2);
  193. }
  194. int IComparable.CompareTo(object obj)
  195. {
  196. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  197. }
  198. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  199. {
  200. if (other == null) return 1;
  201. Tuple<T1, T2> objTuple = other as Tuple<T1, T2>;
  202. if (objTuple == null)
  203. {
  204. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  205. }
  206. int c = 0;
  207. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  208. if (c != 0) return c;
  209. return comparer.Compare(m_Item2, objTuple.m_Item2);
  210. }
  211. public override int GetHashCode()
  212. {
  213. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  214. }
  215. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  216. {
  217. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2));
  218. }
  219. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  220. {
  221. return ((IStructuralEquatable)this).GetHashCode(comparer);
  222. }
  223. public override string ToString()
  224. {
  225. StringBuilder sb = new StringBuilder();
  226. sb.Append('(');
  227. return ((ITupleInternal)this).ToString(sb);
  228. }
  229. string ITupleInternal.ToString(StringBuilder sb)
  230. {
  231. sb.Append(m_Item1);
  232. sb.Append(", ");
  233. sb.Append(m_Item2);
  234. sb.Append(')');
  235. return sb.ToString();
  236. }
  237. /// <summary>
  238. /// The number of positions in this data structure.
  239. /// </summary>
  240. int ITuple.Length => 2;
  241. /// <summary>
  242. /// Get the element at position <param name="index"/>.
  243. /// </summary>
  244. object ITuple.this[int index]
  245. {
  246. get
  247. {
  248. switch (index)
  249. {
  250. case 0:
  251. return Item1;
  252. case 1:
  253. return Item2;
  254. default:
  255. throw new IndexOutOfRangeException();
  256. }
  257. }
  258. }
  259. }
  260. [Serializable]
  261. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  262. public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  263. {
  264. private readonly T1 m_Item1; // Do not rename (binary serialization)
  265. private readonly T2 m_Item2; // Do not rename (binary serialization)
  266. private readonly T3 m_Item3; // Do not rename (binary serialization)
  267. public T1 Item1 { get { return m_Item1; } }
  268. public T2 Item2 { get { return m_Item2; } }
  269. public T3 Item3 { get { return m_Item3; } }
  270. public Tuple(T1 item1, T2 item2, T3 item3)
  271. {
  272. m_Item1 = item1;
  273. m_Item2 = item2;
  274. m_Item3 = item3;
  275. }
  276. public override bool Equals(object obj)
  277. {
  278. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  279. }
  280. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  281. {
  282. if (other == null) return false;
  283. Tuple<T1, T2, T3> objTuple = other as Tuple<T1, T2, T3>;
  284. if (objTuple == null)
  285. {
  286. return false;
  287. }
  288. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3);
  289. }
  290. int IComparable.CompareTo(object obj)
  291. {
  292. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  293. }
  294. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  295. {
  296. if (other == null) return 1;
  297. Tuple<T1, T2, T3> objTuple = other as Tuple<T1, T2, T3>;
  298. if (objTuple == null)
  299. {
  300. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  301. }
  302. int c = 0;
  303. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  304. if (c != 0) return c;
  305. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  306. if (c != 0) return c;
  307. return comparer.Compare(m_Item3, objTuple.m_Item3);
  308. }
  309. public override int GetHashCode()
  310. {
  311. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  312. }
  313. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  314. {
  315. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3));
  316. }
  317. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  318. {
  319. return ((IStructuralEquatable)this).GetHashCode(comparer);
  320. }
  321. public override string ToString()
  322. {
  323. StringBuilder sb = new StringBuilder();
  324. sb.Append('(');
  325. return ((ITupleInternal)this).ToString(sb);
  326. }
  327. string ITupleInternal.ToString(StringBuilder sb)
  328. {
  329. sb.Append(m_Item1);
  330. sb.Append(", ");
  331. sb.Append(m_Item2);
  332. sb.Append(", ");
  333. sb.Append(m_Item3);
  334. sb.Append(')');
  335. return sb.ToString();
  336. }
  337. /// <summary>
  338. /// The number of positions in this data structure.
  339. /// </summary>
  340. int ITuple.Length => 3;
  341. /// <summary>
  342. /// Get the element at position <param name="index"/>.
  343. /// </summary>
  344. object ITuple.this[int index]
  345. {
  346. get
  347. {
  348. switch (index)
  349. {
  350. case 0:
  351. return Item1;
  352. case 1:
  353. return Item2;
  354. case 2:
  355. return Item3;
  356. default:
  357. throw new IndexOutOfRangeException();
  358. }
  359. }
  360. }
  361. }
  362. [Serializable]
  363. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  364. public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  365. {
  366. private readonly T1 m_Item1; // Do not rename (binary serialization)
  367. private readonly T2 m_Item2; // Do not rename (binary serialization)
  368. private readonly T3 m_Item3; // Do not rename (binary serialization)
  369. private readonly T4 m_Item4; // Do not rename (binary serialization)
  370. public T1 Item1 { get { return m_Item1; } }
  371. public T2 Item2 { get { return m_Item2; } }
  372. public T3 Item3 { get { return m_Item3; } }
  373. public T4 Item4 { get { return m_Item4; } }
  374. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4)
  375. {
  376. m_Item1 = item1;
  377. m_Item2 = item2;
  378. m_Item3 = item3;
  379. m_Item4 = item4;
  380. }
  381. public override bool Equals(object obj)
  382. {
  383. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  384. }
  385. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  386. {
  387. if (other == null) return false;
  388. Tuple<T1, T2, T3, T4> objTuple = other as Tuple<T1, T2, T3, T4>;
  389. if (objTuple == null)
  390. {
  391. return false;
  392. }
  393. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4);
  394. }
  395. int IComparable.CompareTo(object obj)
  396. {
  397. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  398. }
  399. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  400. {
  401. if (other == null) return 1;
  402. Tuple<T1, T2, T3, T4> objTuple = other as Tuple<T1, T2, T3, T4>;
  403. if (objTuple == null)
  404. {
  405. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  406. }
  407. int c = 0;
  408. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  409. if (c != 0) return c;
  410. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  411. if (c != 0) return c;
  412. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  413. if (c != 0) return c;
  414. return comparer.Compare(m_Item4, objTuple.m_Item4);
  415. }
  416. public override int GetHashCode()
  417. {
  418. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  419. }
  420. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  421. {
  422. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4));
  423. }
  424. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  425. {
  426. return ((IStructuralEquatable)this).GetHashCode(comparer);
  427. }
  428. public override string ToString()
  429. {
  430. StringBuilder sb = new StringBuilder();
  431. sb.Append('(');
  432. return ((ITupleInternal)this).ToString(sb);
  433. }
  434. string ITupleInternal.ToString(StringBuilder sb)
  435. {
  436. sb.Append(m_Item1);
  437. sb.Append(", ");
  438. sb.Append(m_Item2);
  439. sb.Append(", ");
  440. sb.Append(m_Item3);
  441. sb.Append(", ");
  442. sb.Append(m_Item4);
  443. sb.Append(')');
  444. return sb.ToString();
  445. }
  446. /// <summary>
  447. /// The number of positions in this data structure.
  448. /// </summary>
  449. int ITuple.Length => 4;
  450. /// <summary>
  451. /// Get the element at position <param name="index"/>.
  452. /// </summary>
  453. object ITuple.this[int index]
  454. {
  455. get
  456. {
  457. switch (index)
  458. {
  459. case 0:
  460. return Item1;
  461. case 1:
  462. return Item2;
  463. case 2:
  464. return Item3;
  465. case 3:
  466. return Item4;
  467. default:
  468. throw new IndexOutOfRangeException();
  469. }
  470. }
  471. }
  472. }
  473. [Serializable]
  474. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  475. public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  476. {
  477. private readonly T1 m_Item1; // Do not rename (binary serialization)
  478. private readonly T2 m_Item2; // Do not rename (binary serialization)
  479. private readonly T3 m_Item3; // Do not rename (binary serialization)
  480. private readonly T4 m_Item4; // Do not rename (binary serialization)
  481. private readonly T5 m_Item5; // Do not rename (binary serialization)
  482. public T1 Item1 { get { return m_Item1; } }
  483. public T2 Item2 { get { return m_Item2; } }
  484. public T3 Item3 { get { return m_Item3; } }
  485. public T4 Item4 { get { return m_Item4; } }
  486. public T5 Item5 { get { return m_Item5; } }
  487. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
  488. {
  489. m_Item1 = item1;
  490. m_Item2 = item2;
  491. m_Item3 = item3;
  492. m_Item4 = item4;
  493. m_Item5 = item5;
  494. }
  495. public override bool Equals(object obj)
  496. {
  497. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  498. }
  499. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  500. {
  501. if (other == null) return false;
  502. Tuple<T1, T2, T3, T4, T5> objTuple = other as Tuple<T1, T2, T3, T4, T5>;
  503. if (objTuple == null)
  504. {
  505. return false;
  506. }
  507. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4) && comparer.Equals(m_Item5, objTuple.m_Item5);
  508. }
  509. int IComparable.CompareTo(object obj)
  510. {
  511. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  512. }
  513. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  514. {
  515. if (other == null) return 1;
  516. Tuple<T1, T2, T3, T4, T5> objTuple = other as Tuple<T1, T2, T3, T4, T5>;
  517. if (objTuple == null)
  518. {
  519. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  520. }
  521. int c = 0;
  522. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  523. if (c != 0) return c;
  524. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  525. if (c != 0) return c;
  526. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  527. if (c != 0) return c;
  528. c = comparer.Compare(m_Item4, objTuple.m_Item4);
  529. if (c != 0) return c;
  530. return comparer.Compare(m_Item5, objTuple.m_Item5);
  531. }
  532. public override int GetHashCode()
  533. {
  534. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  535. }
  536. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  537. {
  538. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5));
  539. }
  540. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  541. {
  542. return ((IStructuralEquatable)this).GetHashCode(comparer);
  543. }
  544. public override string ToString()
  545. {
  546. StringBuilder sb = new StringBuilder();
  547. sb.Append('(');
  548. return ((ITupleInternal)this).ToString(sb);
  549. }
  550. string ITupleInternal.ToString(StringBuilder sb)
  551. {
  552. sb.Append(m_Item1);
  553. sb.Append(", ");
  554. sb.Append(m_Item2);
  555. sb.Append(", ");
  556. sb.Append(m_Item3);
  557. sb.Append(", ");
  558. sb.Append(m_Item4);
  559. sb.Append(", ");
  560. sb.Append(m_Item5);
  561. sb.Append(')');
  562. return sb.ToString();
  563. }
  564. /// <summary>
  565. /// The number of positions in this data structure.
  566. /// </summary>
  567. int ITuple.Length => 5;
  568. /// <summary>
  569. /// Get the element at position <param name="index"/>.
  570. /// </summary>
  571. object ITuple.this[int index]
  572. {
  573. get
  574. {
  575. switch (index)
  576. {
  577. case 0:
  578. return Item1;
  579. case 1:
  580. return Item2;
  581. case 2:
  582. return Item3;
  583. case 3:
  584. return Item4;
  585. case 4:
  586. return Item5;
  587. default:
  588. throw new IndexOutOfRangeException();
  589. }
  590. }
  591. }
  592. }
  593. [Serializable]
  594. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  595. public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  596. {
  597. private readonly T1 m_Item1; // Do not rename (binary serialization)
  598. private readonly T2 m_Item2; // Do not rename (binary serialization)
  599. private readonly T3 m_Item3; // Do not rename (binary serialization)
  600. private readonly T4 m_Item4; // Do not rename (binary serialization)
  601. private readonly T5 m_Item5; // Do not rename (binary serialization)
  602. private readonly T6 m_Item6; // Do not rename (binary serialization)
  603. public T1 Item1 { get { return m_Item1; } }
  604. public T2 Item2 { get { return m_Item2; } }
  605. public T3 Item3 { get { return m_Item3; } }
  606. public T4 Item4 { get { return m_Item4; } }
  607. public T5 Item5 { get { return m_Item5; } }
  608. public T6 Item6 { get { return m_Item6; } }
  609. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
  610. {
  611. m_Item1 = item1;
  612. m_Item2 = item2;
  613. m_Item3 = item3;
  614. m_Item4 = item4;
  615. m_Item5 = item5;
  616. m_Item6 = item6;
  617. }
  618. public override bool Equals(object obj)
  619. {
  620. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  621. }
  622. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  623. {
  624. if (other == null) return false;
  625. Tuple<T1, T2, T3, T4, T5, T6> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6>;
  626. if (objTuple == null)
  627. {
  628. return false;
  629. }
  630. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4) && comparer.Equals(m_Item5, objTuple.m_Item5) && comparer.Equals(m_Item6, objTuple.m_Item6);
  631. }
  632. int IComparable.CompareTo(object obj)
  633. {
  634. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  635. }
  636. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  637. {
  638. if (other == null) return 1;
  639. Tuple<T1, T2, T3, T4, T5, T6> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6>;
  640. if (objTuple == null)
  641. {
  642. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  643. }
  644. int c = 0;
  645. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  646. if (c != 0) return c;
  647. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  648. if (c != 0) return c;
  649. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  650. if (c != 0) return c;
  651. c = comparer.Compare(m_Item4, objTuple.m_Item4);
  652. if (c != 0) return c;
  653. c = comparer.Compare(m_Item5, objTuple.m_Item5);
  654. if (c != 0) return c;
  655. return comparer.Compare(m_Item6, objTuple.m_Item6);
  656. }
  657. public override int GetHashCode()
  658. {
  659. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  660. }
  661. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  662. {
  663. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6));
  664. }
  665. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  666. {
  667. return ((IStructuralEquatable)this).GetHashCode(comparer);
  668. }
  669. public override string ToString()
  670. {
  671. StringBuilder sb = new StringBuilder();
  672. sb.Append('(');
  673. return ((ITupleInternal)this).ToString(sb);
  674. }
  675. string ITupleInternal.ToString(StringBuilder sb)
  676. {
  677. sb.Append(m_Item1);
  678. sb.Append(", ");
  679. sb.Append(m_Item2);
  680. sb.Append(", ");
  681. sb.Append(m_Item3);
  682. sb.Append(", ");
  683. sb.Append(m_Item4);
  684. sb.Append(", ");
  685. sb.Append(m_Item5);
  686. sb.Append(", ");
  687. sb.Append(m_Item6);
  688. sb.Append(')');
  689. return sb.ToString();
  690. }
  691. /// <summary>
  692. /// The number of positions in this data structure.
  693. /// </summary>
  694. int ITuple.Length => 6;
  695. /// <summary>
  696. /// Get the element at position <param name="index"/>.
  697. /// </summary>
  698. object ITuple.this[int index]
  699. {
  700. get
  701. {
  702. switch (index)
  703. {
  704. case 0:
  705. return Item1;
  706. case 1:
  707. return Item2;
  708. case 2:
  709. return Item3;
  710. case 3:
  711. return Item4;
  712. case 4:
  713. return Item5;
  714. case 5:
  715. return Item6;
  716. default:
  717. throw new IndexOutOfRangeException();
  718. }
  719. }
  720. }
  721. }
  722. [Serializable]
  723. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  724. public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  725. {
  726. private readonly T1 m_Item1; // Do not rename (binary serialization)
  727. private readonly T2 m_Item2; // Do not rename (binary serialization)
  728. private readonly T3 m_Item3; // Do not rename (binary serialization)
  729. private readonly T4 m_Item4; // Do not rename (binary serialization)
  730. private readonly T5 m_Item5; // Do not rename (binary serialization)
  731. private readonly T6 m_Item6; // Do not rename (binary serialization)
  732. private readonly T7 m_Item7; // Do not rename (binary serialization)
  733. public T1 Item1 { get { return m_Item1; } }
  734. public T2 Item2 { get { return m_Item2; } }
  735. public T3 Item3 { get { return m_Item3; } }
  736. public T4 Item4 { get { return m_Item4; } }
  737. public T5 Item5 { get { return m_Item5; } }
  738. public T6 Item6 { get { return m_Item6; } }
  739. public T7 Item7 { get { return m_Item7; } }
  740. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
  741. {
  742. m_Item1 = item1;
  743. m_Item2 = item2;
  744. m_Item3 = item3;
  745. m_Item4 = item4;
  746. m_Item5 = item5;
  747. m_Item6 = item6;
  748. m_Item7 = item7;
  749. }
  750. public override bool Equals(object obj)
  751. {
  752. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  753. }
  754. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  755. {
  756. if (other == null) return false;
  757. Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7>;
  758. if (objTuple == null)
  759. {
  760. return false;
  761. }
  762. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4) && comparer.Equals(m_Item5, objTuple.m_Item5) && comparer.Equals(m_Item6, objTuple.m_Item6) && comparer.Equals(m_Item7, objTuple.m_Item7);
  763. }
  764. int IComparable.CompareTo(object obj)
  765. {
  766. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  767. }
  768. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  769. {
  770. if (other == null) return 1;
  771. Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7>;
  772. if (objTuple == null)
  773. {
  774. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  775. }
  776. int c = 0;
  777. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  778. if (c != 0) return c;
  779. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  780. if (c != 0) return c;
  781. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  782. if (c != 0) return c;
  783. c = comparer.Compare(m_Item4, objTuple.m_Item4);
  784. if (c != 0) return c;
  785. c = comparer.Compare(m_Item5, objTuple.m_Item5);
  786. if (c != 0) return c;
  787. c = comparer.Compare(m_Item6, objTuple.m_Item6);
  788. if (c != 0) return c;
  789. return comparer.Compare(m_Item7, objTuple.m_Item7);
  790. }
  791. public override int GetHashCode()
  792. {
  793. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  794. }
  795. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  796. {
  797. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7));
  798. }
  799. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  800. {
  801. return ((IStructuralEquatable)this).GetHashCode(comparer);
  802. }
  803. public override string ToString()
  804. {
  805. StringBuilder sb = new StringBuilder();
  806. sb.Append('(');
  807. return ((ITupleInternal)this).ToString(sb);
  808. }
  809. string ITupleInternal.ToString(StringBuilder sb)
  810. {
  811. sb.Append(m_Item1);
  812. sb.Append(", ");
  813. sb.Append(m_Item2);
  814. sb.Append(", ");
  815. sb.Append(m_Item3);
  816. sb.Append(", ");
  817. sb.Append(m_Item4);
  818. sb.Append(", ");
  819. sb.Append(m_Item5);
  820. sb.Append(", ");
  821. sb.Append(m_Item6);
  822. sb.Append(", ");
  823. sb.Append(m_Item7);
  824. sb.Append(')');
  825. return sb.ToString();
  826. }
  827. /// <summary>
  828. /// The number of positions in this data structure.
  829. /// </summary>
  830. int ITuple.Length => 7;
  831. /// <summary>
  832. /// Get the element at position <param name="index"/>.
  833. /// </summary>
  834. object ITuple.this[int index]
  835. {
  836. get
  837. {
  838. switch (index)
  839. {
  840. case 0:
  841. return Item1;
  842. case 1:
  843. return Item2;
  844. case 2:
  845. return Item3;
  846. case 3:
  847. return Item4;
  848. case 4:
  849. return Item5;
  850. case 5:
  851. return Item6;
  852. case 6:
  853. return Item7;
  854. default:
  855. throw new IndexOutOfRangeException();
  856. }
  857. }
  858. }
  859. }
  860. [Serializable]
  861. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  862. public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  863. {
  864. private readonly T1 m_Item1; // Do not rename (binary serialization)
  865. private readonly T2 m_Item2; // Do not rename (binary serialization)
  866. private readonly T3 m_Item3; // Do not rename (binary serialization)
  867. private readonly T4 m_Item4; // Do not rename (binary serialization)
  868. private readonly T5 m_Item5; // Do not rename (binary serialization)
  869. private readonly T6 m_Item6; // Do not rename (binary serialization)
  870. private readonly T7 m_Item7; // Do not rename (binary serialization)
  871. private readonly TRest m_Rest; // Do not rename (binary serialization)
  872. public T1 Item1 { get { return m_Item1; } }
  873. public T2 Item2 { get { return m_Item2; } }
  874. public T3 Item3 { get { return m_Item3; } }
  875. public T4 Item4 { get { return m_Item4; } }
  876. public T5 Item5 { get { return m_Item5; } }
  877. public T6 Item6 { get { return m_Item6; } }
  878. public T7 Item7 { get { return m_Item7; } }
  879. public TRest Rest { get { return m_Rest; } }
  880. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest)
  881. {
  882. if (!(rest is ITupleInternal))
  883. {
  884. throw new ArgumentException(SR.ArgumentException_TupleLastArgumentNotATuple);
  885. }
  886. m_Item1 = item1;
  887. m_Item2 = item2;
  888. m_Item3 = item3;
  889. m_Item4 = item4;
  890. m_Item5 = item5;
  891. m_Item6 = item6;
  892. m_Item7 = item7;
  893. m_Rest = rest;
  894. }
  895. public override bool Equals(object obj)
  896. {
  897. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  898. }
  899. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  900. {
  901. if (other == null) return false;
  902. Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>;
  903. if (objTuple == null)
  904. {
  905. return false;
  906. }
  907. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3) && comparer.Equals(m_Item4, objTuple.m_Item4) && comparer.Equals(m_Item5, objTuple.m_Item5) && comparer.Equals(m_Item6, objTuple.m_Item6) && comparer.Equals(m_Item7, objTuple.m_Item7) && comparer.Equals(m_Rest, objTuple.m_Rest);
  908. }
  909. int IComparable.CompareTo(object obj)
  910. {
  911. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  912. }
  913. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  914. {
  915. if (other == null) return 1;
  916. Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>;
  917. if (objTuple == null)
  918. {
  919. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  920. }
  921. int c = 0;
  922. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  923. if (c != 0) return c;
  924. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  925. if (c != 0) return c;
  926. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  927. if (c != 0) return c;
  928. c = comparer.Compare(m_Item4, objTuple.m_Item4);
  929. if (c != 0) return c;
  930. c = comparer.Compare(m_Item5, objTuple.m_Item5);
  931. if (c != 0) return c;
  932. c = comparer.Compare(m_Item6, objTuple.m_Item6);
  933. if (c != 0) return c;
  934. c = comparer.Compare(m_Item7, objTuple.m_Item7);
  935. if (c != 0) return c;
  936. return comparer.Compare(m_Rest, objTuple.m_Rest);
  937. }
  938. public override int GetHashCode()
  939. {
  940. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  941. }
  942. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  943. {
  944. // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
  945. ITupleInternal t = (ITupleInternal)m_Rest;
  946. if (t.Length >= 8) { return t.GetHashCode(comparer); }
  947. // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest
  948. int k = 8 - t.Length;
  949. switch (k)
  950. {
  951. case 1:
  952. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  953. case 2:
  954. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  955. case 3:
  956. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  957. case 4:
  958. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  959. case 5:
  960. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  961. case 6:
  962. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  963. case 7:
  964. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  965. }
  966. Debug.Fail("Missed all cases for computing Tuple hash code");
  967. return -1;
  968. }
  969. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  970. {
  971. return ((IStructuralEquatable)this).GetHashCode(comparer);
  972. }
  973. public override string ToString()
  974. {
  975. StringBuilder sb = new StringBuilder();
  976. sb.Append('(');
  977. return ((ITupleInternal)this).ToString(sb);
  978. }
  979. string ITupleInternal.ToString(StringBuilder sb)
  980. {
  981. sb.Append(m_Item1);
  982. sb.Append(", ");
  983. sb.Append(m_Item2);
  984. sb.Append(", ");
  985. sb.Append(m_Item3);
  986. sb.Append(", ");
  987. sb.Append(m_Item4);
  988. sb.Append(", ");
  989. sb.Append(m_Item5);
  990. sb.Append(", ");
  991. sb.Append(m_Item6);
  992. sb.Append(", ");
  993. sb.Append(m_Item7);
  994. sb.Append(", ");
  995. return ((ITupleInternal)m_Rest).ToString(sb);
  996. }
  997. /// <summary>
  998. /// The number of positions in this data structure.
  999. /// </summary>
  1000. int ITuple.Length
  1001. {
  1002. get
  1003. {
  1004. return 7 + ((ITupleInternal)Rest).Length;
  1005. }
  1006. }
  1007. /// <summary>
  1008. /// Get the element at position <param name="index"/>.
  1009. /// </summary>
  1010. object ITuple.this[int index]
  1011. {
  1012. get
  1013. {
  1014. switch (index)
  1015. {
  1016. case 0:
  1017. return Item1;
  1018. case 1:
  1019. return Item2;
  1020. case 2:
  1021. return Item3;
  1022. case 3:
  1023. return Item4;
  1024. case 4:
  1025. return Item5;
  1026. case 5:
  1027. return Item6;
  1028. case 6:
  1029. return Item7;
  1030. }
  1031. return ((ITupleInternal)Rest)[index - 7];
  1032. }
  1033. }
  1034. }
  1035. }