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.
5 using System
.Collections
;
6 using System
.Collections
.Generic
;
7 using System
.Diagnostics
;
8 using System
.Runtime
.CompilerServices
;
14 /// Helper so we can call some tuple methods recursively without knowing the underlying types.
16 internal interface ITupleInternal
: ITuple
18 string ToString(StringBuilder sb
);
19 int GetHashCode(IEqualityComparer comparer
);
22 public static class Tuple
24 public static Tuple
<T1
> Create
<T1
>(T1 item1
)
26 return new Tuple
<T1
>(item1
);
29 public static Tuple
<T1
, T2
> Create
<T1
, T2
>(T1 item1
, T2 item2
)
31 return new Tuple
<T1
, T2
>(item1
, item2
);
34 public static Tuple
<T1
, T2
, T3
> Create
<T1
, T2
, T3
>(T1 item1
, T2 item2
, T3 item3
)
36 return new Tuple
<T1
, T2
, T3
>(item1
, item2
, item3
);
39 public static Tuple
<T1
, T2
, T3
, T4
> Create
<T1
, T2
, T3
, T4
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
)
41 return new Tuple
<T1
, T2
, T3
, T4
>(item1
, item2
, item3
, item4
);
44 public static Tuple
<T1
, T2
, T3
, T4
, T5
> Create
<T1
, T2
, T3
, T4
, T5
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
)
46 return new Tuple
<T1
, T2
, T3
, T4
, T5
>(item1
, item2
, item3
, item4
, item5
);
49 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
)
51 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
>(item1
, item2
, item3
, item4
, item5
, item6
);
54 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
)
56 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>(item1
, item2
, item3
, item4
, item5
, item6
, item7
);
59 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
)
61 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, Tuple
<T8
>>(item1
, item2
, item3
, item4
, item5
, item6
, item7
, new Tuple
<T8
>(item8
));
64 // Note: F# compiler depends on the exact tuple hashing algorithm. Do not ever change it.
66 // From System.Web.Util.HashCodeCombiner
67 internal static int CombineHashCodes(int h1
, int h2
)
69 return ((h1
<< 5) + h1
) ^ h2
;
72 internal static int CombineHashCodes(int h1
, int h2
, int h3
)
74 return CombineHashCodes(CombineHashCodes(h1
, h2
), h3
);
77 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
)
79 return CombineHashCodes(CombineHashCodes(h1
, h2
), CombineHashCodes(h3
, h4
));
82 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
)
84 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), h5
);
87 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
)
89 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
));
92 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
, int h7
)
94 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
, h7
));
97 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
, int h7
, int h8
)
99 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
, h7
, h8
));
104 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
105 public class Tuple
<T1
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
107 private readonly T1 m_Item1
; // Do not rename (binary serialization)
109 public T1 Item1
=> m_Item1
;
111 public Tuple(T1 item1
)
116 public override bool Equals(object? obj
)
118 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
121 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
123 if (other
== null) return false;
125 if (!(other
is Tuple
<T1
> objTuple
))
130 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
);
133 int IComparable
.CompareTo(object? obj
)
135 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
138 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
140 if (other
== null) return 1;
142 if (!(other
is Tuple
<T1
> objTuple
))
144 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
147 return comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
150 public override int GetHashCode()
152 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
155 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
157 return comparer
.GetHashCode(m_Item1
!);
160 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
162 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
164 public override string ToString()
166 StringBuilder sb
= new StringBuilder();
168 return ((ITupleInternal
)this).ToString(sb
);
171 string ITupleInternal
.ToString(StringBuilder sb
)
175 return sb
.ToString();
179 /// The number of positions in this data structure.
181 int ITuple
.Length
=> 1;
184 /// Get the element at position <param name="index"/>.
186 object? ITuple
.this[int index
]
192 throw new IndexOutOfRangeException();
200 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
201 public class Tuple
<T1
, T2
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
203 private readonly T1 m_Item1
; // Do not rename (binary serialization)
204 private readonly T2 m_Item2
; // Do not rename (binary serialization)
206 public T1 Item1
=> m_Item1
;
207 public T2 Item2
=> m_Item2
;
209 public Tuple(T1 item1
, T2 item2
)
215 public override bool Equals(object? obj
)
217 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
220 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
222 if (other
== null) return false;
224 if (!(other
is Tuple
<T1
, T2
> objTuple
))
229 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
);
232 int IComparable
.CompareTo(object? obj
)
234 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
237 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
239 if (other
== null) return 1;
241 if (!(other
is Tuple
<T1
, T2
> objTuple
))
243 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
246 int c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
248 if (c
!= 0) return c
;
250 return comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
253 public override int GetHashCode()
255 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
258 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
260 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!));
263 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
265 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
267 public override string ToString()
269 StringBuilder sb
= new StringBuilder();
271 return ((ITupleInternal
)this).ToString(sb
);
274 string ITupleInternal
.ToString(StringBuilder sb
)
280 return sb
.ToString();
284 /// The number of positions in this data structure.
286 int ITuple
.Length
=> 2;
289 /// Get the element at position <param name="index"/>.
291 object? ITuple
.this[int index
] =>
296 _
=> throw new IndexOutOfRangeException(),
301 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
302 public class Tuple
<T1
, T2
, T3
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
304 private readonly T1 m_Item1
; // Do not rename (binary serialization)
305 private readonly T2 m_Item2
; // Do not rename (binary serialization)
306 private readonly T3 m_Item3
; // Do not rename (binary serialization)
308 public T1 Item1
=> m_Item1
;
309 public T2 Item2
=> m_Item2
;
310 public T3 Item3
=> m_Item3
;
312 public Tuple(T1 item1
, T2 item2
, T3 item3
)
319 public override bool Equals(object? obj
)
321 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
324 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
326 if (other
== null) return false;
328 if (!(other
is Tuple
<T1
, T2
, T3
> objTuple
))
333 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
) && comparer
.Equals(m_Item3
, objTuple
.m_Item3
);
336 int IComparable
.CompareTo(object? obj
)
338 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
341 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
343 if (other
== null) return 1;
345 if (!(other
is Tuple
<T1
, T2
, T3
> objTuple
))
347 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
350 int c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
352 if (c
!= 0) return c
;
354 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
356 if (c
!= 0) return c
;
358 return comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
361 public override int GetHashCode()
363 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
366 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
368 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!));
371 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
373 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
375 public override string ToString()
377 StringBuilder sb
= new StringBuilder();
379 return ((ITupleInternal
)this).ToString(sb
);
382 string ITupleInternal
.ToString(StringBuilder sb
)
390 return sb
.ToString();
394 /// The number of positions in this data structure.
396 int ITuple
.Length
=> 3;
399 /// Get the element at position <param name="index"/>.
401 object? ITuple
.this[int index
] =>
407 _
=> throw new IndexOutOfRangeException(),
412 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
413 public class Tuple
<T1
, T2
, T3
, T4
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
415 private readonly T1 m_Item1
; // Do not rename (binary serialization)
416 private readonly T2 m_Item2
; // Do not rename (binary serialization)
417 private readonly T3 m_Item3
; // Do not rename (binary serialization)
418 private readonly T4 m_Item4
; // Do not rename (binary serialization)
420 public T1 Item1
=> m_Item1
;
421 public T2 Item2
=> m_Item2
;
422 public T3 Item3
=> m_Item3
;
423 public T4 Item4
=> m_Item4
;
425 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
)
433 public override bool Equals(object? obj
)
435 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
438 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
440 if (other
== null) return false;
442 if (!(other
is Tuple
<T1
, T2
, T3
, T4
> objTuple
))
447 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
);
450 int IComparable
.CompareTo(object? obj
)
452 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
455 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
457 if (other
== null) return 1;
459 if (!(other
is Tuple
<T1
, T2
, T3
, T4
> objTuple
))
461 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
464 int c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
466 if (c
!= 0) return c
;
468 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
470 if (c
!= 0) return c
;
472 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
474 if (c
!= 0) return c
;
476 return comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
479 public override int GetHashCode()
481 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
484 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
486 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!));
489 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
491 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
493 public override string ToString()
495 StringBuilder sb
= new StringBuilder();
497 return ((ITupleInternal
)this).ToString(sb
);
500 string ITupleInternal
.ToString(StringBuilder sb
)
510 return sb
.ToString();
514 /// The number of positions in this data structure.
516 int ITuple
.Length
=> 4;
519 /// Get the element at position <param name="index"/>.
521 object? ITuple
.this[int index
] =>
528 _
=> throw new IndexOutOfRangeException(),
533 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
534 public class Tuple
<T1
, T2
, T3
, T4
, T5
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
536 private readonly T1 m_Item1
; // Do not rename (binary serialization)
537 private readonly T2 m_Item2
; // Do not rename (binary serialization)
538 private readonly T3 m_Item3
; // Do not rename (binary serialization)
539 private readonly T4 m_Item4
; // Do not rename (binary serialization)
540 private readonly T5 m_Item5
; // Do not rename (binary serialization)
542 public T1 Item1
=> m_Item1
;
543 public T2 Item2
=> m_Item2
;
544 public T3 Item3
=> m_Item3
;
545 public T4 Item4
=> m_Item4
;
546 public T5 Item5
=> m_Item5
;
548 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
)
557 public override bool Equals(object? obj
)
559 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
562 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
564 if (other
== null) return false;
566 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
> objTuple
))
571 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
);
574 int IComparable
.CompareTo(object? obj
)
576 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
579 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
581 if (other
== null) return 1;
583 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
> objTuple
))
585 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
588 int c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
590 if (c
!= 0) return c
;
592 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
594 if (c
!= 0) return c
;
596 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
598 if (c
!= 0) return c
;
600 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
602 if (c
!= 0) return c
;
604 return comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
607 public override int GetHashCode()
609 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
612 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
614 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!));
617 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
619 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
621 public override string ToString()
623 StringBuilder sb
= new StringBuilder();
625 return ((ITupleInternal
)this).ToString(sb
);
628 string ITupleInternal
.ToString(StringBuilder sb
)
640 return sb
.ToString();
644 /// The number of positions in this data structure.
646 int ITuple
.Length
=> 5;
649 /// Get the element at position <param name="index"/>.
651 object? ITuple
.this[int index
] =>
659 _
=> throw new IndexOutOfRangeException(),
664 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
665 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
667 private readonly T1 m_Item1
; // Do not rename (binary serialization)
668 private readonly T2 m_Item2
; // Do not rename (binary serialization)
669 private readonly T3 m_Item3
; // Do not rename (binary serialization)
670 private readonly T4 m_Item4
; // Do not rename (binary serialization)
671 private readonly T5 m_Item5
; // Do not rename (binary serialization)
672 private readonly T6 m_Item6
; // Do not rename (binary serialization)
674 public T1 Item1
=> m_Item1
;
675 public T2 Item2
=> m_Item2
;
676 public T3 Item3
=> m_Item3
;
677 public T4 Item4
=> m_Item4
;
678 public T5 Item5
=> m_Item5
;
679 public T6 Item6
=> m_Item6
;
681 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
)
691 public override bool Equals(object? obj
)
693 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
696 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
698 if (other
== null) return false;
700 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> objTuple
))
705 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
);
708 int IComparable
.CompareTo(object? obj
)
710 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
713 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
715 if (other
== null) return 1;
717 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> objTuple
))
719 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
722 int c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
724 if (c
!= 0) return c
;
726 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
728 if (c
!= 0) return c
;
730 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
732 if (c
!= 0) return c
;
734 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
736 if (c
!= 0) return c
;
738 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
740 if (c
!= 0) return c
;
742 return comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
745 public override int GetHashCode()
747 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
750 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
752 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
!));
755 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
757 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
759 public override string ToString()
761 StringBuilder sb
= new StringBuilder();
763 return ((ITupleInternal
)this).ToString(sb
);
766 string ITupleInternal
.ToString(StringBuilder sb
)
780 return sb
.ToString();
784 /// The number of positions in this data structure.
786 int ITuple
.Length
=> 6;
789 /// Get the element at position <param name="index"/>.
791 object? ITuple
.this[int index
] =>
800 _
=> throw new IndexOutOfRangeException(),
805 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
806 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
808 private readonly T1 m_Item1
; // Do not rename (binary serialization)
809 private readonly T2 m_Item2
; // Do not rename (binary serialization)
810 private readonly T3 m_Item3
; // Do not rename (binary serialization)
811 private readonly T4 m_Item4
; // Do not rename (binary serialization)
812 private readonly T5 m_Item5
; // Do not rename (binary serialization)
813 private readonly T6 m_Item6
; // Do not rename (binary serialization)
814 private readonly T7 m_Item7
; // Do not rename (binary serialization)
816 public T1 Item1
=> m_Item1
;
817 public T2 Item2
=> m_Item2
;
818 public T3 Item3
=> m_Item3
;
819 public T4 Item4
=> m_Item4
;
820 public T5 Item5
=> m_Item5
;
821 public T6 Item6
=> m_Item6
;
822 public T7 Item7
=> m_Item7
;
824 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
)
835 public override bool Equals(object? obj
)
837 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
840 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
842 if (other
== null) return false;
844 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> objTuple
))
849 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
);
852 int IComparable
.CompareTo(object? obj
)
854 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
857 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
859 if (other
== null) return 1;
861 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> objTuple
))
863 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
866 int c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
868 if (c
!= 0) return c
;
870 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
872 if (c
!= 0) return c
;
874 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
876 if (c
!= 0) return c
;
878 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
880 if (c
!= 0) return c
;
882 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
884 if (c
!= 0) return c
;
886 c
= comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
888 if (c
!= 0) return c
;
890 return comparer
.Compare(m_Item7
, objTuple
.m_Item7
);
893 public override int GetHashCode()
895 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
898 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
900 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
!));
903 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
905 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
907 public override string ToString()
909 StringBuilder sb
= new StringBuilder();
911 return ((ITupleInternal
)this).ToString(sb
);
914 string ITupleInternal
.ToString(StringBuilder sb
)
930 return sb
.ToString();
934 /// The number of positions in this data structure.
936 int ITuple
.Length
=> 7;
939 /// Get the element at position <param name="index"/>.
941 object? ITuple
.this[int index
] =>
951 _
=> throw new IndexOutOfRangeException(),
956 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
957 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple where TRest
: notnull
959 private readonly T1 m_Item1
; // Do not rename (binary serialization)
960 private readonly T2 m_Item2
; // Do not rename (binary serialization)
961 private readonly T3 m_Item3
; // Do not rename (binary serialization)
962 private readonly T4 m_Item4
; // Do not rename (binary serialization)
963 private readonly T5 m_Item5
; // Do not rename (binary serialization)
964 private readonly T6 m_Item6
; // Do not rename (binary serialization)
965 private readonly T7 m_Item7
; // Do not rename (binary serialization)
966 private readonly TRest m_Rest
; // Do not rename (binary serialization)
968 public T1 Item1
=> m_Item1
;
969 public T2 Item2
=> m_Item2
;
970 public T3 Item3
=> m_Item3
;
971 public T4 Item4
=> m_Item4
;
972 public T5 Item5
=> m_Item5
;
973 public T6 Item6
=> m_Item6
;
974 public T7 Item7
=> m_Item7
;
975 public TRest Rest
=> m_Rest
;
977 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
, TRest rest
)
979 if (!(rest
is ITupleInternal
))
981 throw new ArgumentException(SR
.ArgumentException_TupleLastArgumentNotATuple
);
994 public override bool Equals(object? obj
)
996 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
999 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
1001 if (other
== null) return false;
1003 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> objTuple
))
1008 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
);
1011 int IComparable
.CompareTo(object? obj
)
1013 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
1016 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
1018 if (other
== null) return 1;
1020 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> objTuple
))
1022 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
1025 int c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
1027 if (c
!= 0) return c
;
1029 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
1031 if (c
!= 0) return c
;
1033 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
1035 if (c
!= 0) return c
;
1037 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
1039 if (c
!= 0) return c
;
1041 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
1043 if (c
!= 0) return c
;
1045 c
= comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
1047 if (c
!= 0) return c
;
1049 c
= comparer
.Compare(m_Item7
, objTuple
.m_Item7
);
1051 if (c
!= 0) return c
;
1053 return comparer
.Compare(m_Rest
, objTuple
.m_Rest
);
1056 public override int GetHashCode()
1058 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
1061 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
1063 // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
1064 ITupleInternal t
= (ITupleInternal
)m_Rest
;
1065 if (t
.Length
>= 8) { return t.GetHashCode(comparer); }
1067 // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest
1068 int k
= 8 - t
.Length
;
1072 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1074 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1076 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1078 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1080 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
));
1082 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
));
1084 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
));
1086 Debug
.Fail("Missed all cases for computing Tuple hash code");
1090 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
1092 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
1094 public override string ToString()
1096 StringBuilder sb
= new StringBuilder();
1098 return ((ITupleInternal
)this).ToString(sb
);
1101 string ITupleInternal
.ToString(StringBuilder sb
)
1117 return ((ITupleInternal
)m_Rest
).ToString(sb
);
1121 /// The number of positions in this data structure.
1123 int ITuple
.Length
=> 7 + ((ITupleInternal
)Rest
).Length
;
1126 /// Get the element at position <param name="index"/>.
1128 object? ITuple
.this[int index
] =>
1139 _
=> ((ITupleInternal
)Rest
)[index
- 7],