3 using System
.Collections
;
4 using System
.Collections
.Generic
;
5 using System
.Diagnostics
.Contracts
;
6 using System
.Runtime
.CompilerServices
;
11 /// Helper so we can call some tuple methods recursively without knowing the underlying types.
13 internal interface ITupleInternal
: ITuple
{
14 string ToString(StringBuilder sb
);
15 int GetHashCode(IEqualityComparer comparer
);
18 public static class Tuple
{
19 public static Tuple
<T1
> Create
<T1
>(T1 item1
) {
20 return new Tuple
<T1
>(item1
);
23 public static Tuple
<T1
, T2
> Create
<T1
, T2
>(T1 item1
, T2 item2
) {
24 return new Tuple
<T1
, T2
>(item1
, item2
);
27 public static Tuple
<T1
, T2
, T3
> Create
<T1
, T2
, T3
>(T1 item1
, T2 item2
, T3 item3
) {
28 return new Tuple
<T1
, T2
, T3
>(item1
, item2
, item3
);
31 public static Tuple
<T1
, T2
, T3
, T4
> Create
<T1
, T2
, T3
, T4
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
) {
32 return new Tuple
<T1
, T2
, T3
, T4
>(item1
, item2
, item3
, item4
);
35 public static Tuple
<T1
, T2
, T3
, T4
, T5
> Create
<T1
, T2
, T3
, T4
, T5
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
) {
36 return new Tuple
<T1
, T2
, T3
, T4
, T5
>(item1
, item2
, item3
, item4
, item5
);
39 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
) {
40 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
>(item1
, item2
, item3
, item4
, item5
, item6
);
43 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
) {
44 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>(item1
, item2
, item3
, item4
, item5
, item6
, item7
);
47 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
) {
48 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, Tuple
<T8
>>(item1
, item2
, item3
, item4
, item5
, item6
, item7
, new Tuple
<T8
>(item8
));
51 // From System.Web.Util.HashCodeCombiner
52 internal static int CombineHashCodes(int h1
, int h2
)
54 return (((h1
<< 5) + h1
) ^ h2
);
57 internal static int CombineHashCodes(int h1
, int h2
, int h3
) {
58 return CombineHashCodes(CombineHashCodes(h1
, h2
), h3
);
61 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
) {
62 return CombineHashCodes(CombineHashCodes(h1
, h2
), CombineHashCodes(h3
, h4
));
65 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
) {
66 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), h5
);
69 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
) {
70 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
));
73 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
, int h7
) {
74 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
, h7
));
77 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
, int h7
, int h8
) {
78 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
, h7
, h8
));
83 public class Tuple
<T1
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
{
85 private readonly T1 m_Item1
;
87 public T1 Item1 { get { return m_Item1; }
}
89 public Tuple(T1 item1
) {
93 public override Boolean
Equals(Object obj
) {
94 return ((IStructuralEquatable
) this).Equals(obj
, EqualityComparer
<Object
>.Default
);
97 Boolean IStructuralEquatable
.Equals(Object other
, IEqualityComparer comparer
) {
98 if (other
== null) return false;
100 Tuple
<T1
> objTuple
= other
as Tuple
<T1
>;
102 if (objTuple
== null) {
106 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
);
109 Int32 IComparable
.CompareTo(Object obj
) {
110 return ((IStructuralComparable
) this).CompareTo(obj
, Comparer
<Object
>.Default
);
113 Int32 IStructuralComparable
.CompareTo(Object other
, IComparer comparer
) {
114 if (other
== null) return 1;
116 Tuple
<T1
> objTuple
= other
as Tuple
<T1
>;
118 if (objTuple
== null) {
119 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
122 return comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
125 public override int GetHashCode() {
126 return ((IStructuralEquatable
) this).GetHashCode(EqualityComparer
<Object
>.Default
);
129 Int32 IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
) {
130 return comparer
.GetHashCode(m_Item1
);
133 Int32 ITupleInternal
.GetHashCode(IEqualityComparer comparer
) {
134 return ((IStructuralEquatable
) this).GetHashCode(comparer
);
136 public override string ToString() {
137 StringBuilder sb
= new StringBuilder();
139 return ((ITupleInternal
)this).ToString(sb
);
142 string ITupleInternal
.ToString(StringBuilder sb
) {
145 return sb
.ToString();
149 /// The number of positions in this data structure.
151 int ITuple
.Length
=> 1;
154 /// Get the element at position <param name="index"/>.
156 object ITuple
.this[int index
]
162 throw new IndexOutOfRangeException();
170 public class Tuple
<T1
, T2
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
{
172 private readonly T1 m_Item1
;
173 private readonly T2 m_Item2
;
175 public T1 Item1 { get { return m_Item1; }
}
176 public T2 Item2 { get { return m_Item2; }
}
178 public Tuple(T1 item1
, T2 item2
) {
183 public override Boolean
Equals(Object obj
) {
184 return ((IStructuralEquatable
) this).Equals(obj
, EqualityComparer
<Object
>.Default
);;
187 Boolean IStructuralEquatable
.Equals(Object other
, IEqualityComparer comparer
) {
188 if (other
== null) return false;
190 Tuple
<T1
, T2
> objTuple
= other
as Tuple
<T1
, T2
>;
192 if (objTuple
== null) {
196 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
);
199 Int32 IComparable
.CompareTo(Object obj
) {
200 return ((IStructuralComparable
) this).CompareTo(obj
, Comparer
<Object
>.Default
);
203 Int32 IStructuralComparable
.CompareTo(Object other
, IComparer comparer
) {
204 if (other
== null) return 1;
206 Tuple
<T1
, T2
> objTuple
= other
as Tuple
<T1
, T2
>;
208 if (objTuple
== null) {
209 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
214 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
216 if (c
!= 0) return c
;
218 return comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
221 public override int GetHashCode() {
222 return ((IStructuralEquatable
) this).GetHashCode(EqualityComparer
<Object
>.Default
);
225 Int32 IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
) {
226 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
), comparer
.GetHashCode(m_Item2
));
229 Int32 ITupleInternal
.GetHashCode(IEqualityComparer comparer
) {
230 return ((IStructuralEquatable
) this).GetHashCode(comparer
);
232 public override string ToString() {
233 StringBuilder sb
= new StringBuilder();
235 return ((ITupleInternal
)this).ToString(sb
);
238 string ITupleInternal
.ToString(StringBuilder sb
) {
243 return sb
.ToString();
247 /// The number of positions in this data structure.
249 int ITuple
.Length
=> 2;
252 /// Get the element at position <param name="index"/>.
254 object ITuple
.this[int index
]
265 throw new IndexOutOfRangeException();
272 public class Tuple
<T1
, T2
, T3
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
{
274 private readonly T1 m_Item1
;
275 private readonly T2 m_Item2
;
276 private readonly T3 m_Item3
;
278 public T1 Item1 { get { return m_Item1; }
}
279 public T2 Item2 { get { return m_Item2; }
}
280 public T3 Item3 { get { return m_Item3; }
}
282 public Tuple(T1 item1
, T2 item2
, T3 item3
) {
288 public override Boolean
Equals(Object obj
) {
289 return ((IStructuralEquatable
) this).Equals(obj
, EqualityComparer
<Object
>.Default
);;
292 Boolean IStructuralEquatable
.Equals(Object other
, IEqualityComparer comparer
) {
293 if (other
== null) return false;
295 Tuple
<T1
, T2
, T3
> objTuple
= other
as Tuple
<T1
, T2
, T3
>;
297 if (objTuple
== null) {
301 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
) && comparer
.Equals(m_Item3
, objTuple
.m_Item3
);
304 Int32 IComparable
.CompareTo(Object obj
) {
305 return ((IStructuralComparable
) this).CompareTo(obj
, Comparer
<Object
>.Default
);
308 Int32 IStructuralComparable
.CompareTo(Object other
, IComparer comparer
) {
309 if (other
== null) return 1;
311 Tuple
<T1
, T2
, T3
> objTuple
= other
as Tuple
<T1
, T2
, T3
>;
313 if (objTuple
== null) {
314 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
319 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
321 if (c
!= 0) return c
;
323 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
325 if (c
!= 0) return c
;
327 return comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
330 public override int GetHashCode() {
331 return ((IStructuralEquatable
) this).GetHashCode(EqualityComparer
<Object
>.Default
);
334 Int32 IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
) {
335 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
), comparer
.GetHashCode(m_Item2
), comparer
.GetHashCode(m_Item3
));
338 Int32 ITupleInternal
.GetHashCode(IEqualityComparer comparer
) {
339 return ((IStructuralEquatable
) this).GetHashCode(comparer
);
341 public override string ToString() {
342 StringBuilder sb
= new StringBuilder();
344 return ((ITupleInternal
)this).ToString(sb
);
347 string ITupleInternal
.ToString(StringBuilder sb
) {
354 return sb
.ToString();
358 /// The number of positions in this data structure.
360 int ITuple
.Length
=> 3;
363 /// Get the element at position <param name="index"/>.
365 object ITuple
.this[int index
]
378 throw new IndexOutOfRangeException();
385 public class Tuple
<T1
, T2
, T3
, T4
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
{
387 private readonly T1 m_Item1
;
388 private readonly T2 m_Item2
;
389 private readonly T3 m_Item3
;
390 private readonly T4 m_Item4
;
392 public T1 Item1 { get { return m_Item1; }
}
393 public T2 Item2 { get { return m_Item2; }
}
394 public T3 Item3 { get { return m_Item3; }
}
395 public T4 Item4 { get { return m_Item4; }
}
397 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
) {
404 public override Boolean
Equals(Object obj
) {
405 return ((IStructuralEquatable
) this).Equals(obj
, EqualityComparer
<Object
>.Default
);;
408 Boolean IStructuralEquatable
.Equals(Object other
, IEqualityComparer comparer
) {
409 if (other
== null) return false;
411 Tuple
<T1
, T2
, T3
, T4
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
>;
413 if (objTuple
== null) {
417 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
);
420 Int32 IComparable
.CompareTo(Object obj
) {
421 return ((IStructuralComparable
) this).CompareTo(obj
, Comparer
<Object
>.Default
);
424 Int32 IStructuralComparable
.CompareTo(Object other
, IComparer comparer
) {
425 if (other
== null) return 1;
427 Tuple
<T1
, T2
, T3
, T4
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
>;
429 if (objTuple
== null) {
430 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
435 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
437 if (c
!= 0) return c
;
439 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
441 if (c
!= 0) return c
;
443 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
445 if (c
!= 0) return c
;
447 return comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
450 public override int GetHashCode() {
451 return ((IStructuralEquatable
) this).GetHashCode(EqualityComparer
<Object
>.Default
);
454 Int32 IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
) {
455 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
), comparer
.GetHashCode(m_Item2
), comparer
.GetHashCode(m_Item3
), comparer
.GetHashCode(m_Item4
));
458 Int32 ITupleInternal
.GetHashCode(IEqualityComparer comparer
) {
459 return ((IStructuralEquatable
) this).GetHashCode(comparer
);
461 public override string ToString() {
462 StringBuilder sb
= new StringBuilder();
464 return ((ITupleInternal
)this).ToString(sb
);
467 string ITupleInternal
.ToString(StringBuilder sb
) {
476 return sb
.ToString();
480 /// The number of positions in this data structure.
482 int ITuple
.Length
=> 4;
485 /// Get the element at position <param name="index"/>.
487 object ITuple
.this[int index
]
502 throw new IndexOutOfRangeException();
509 public class Tuple
<T1
, T2
, T3
, T4
, T5
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
{
511 private readonly T1 m_Item1
;
512 private readonly T2 m_Item2
;
513 private readonly T3 m_Item3
;
514 private readonly T4 m_Item4
;
515 private readonly T5 m_Item5
;
517 public T1 Item1 { get { return m_Item1; }
}
518 public T2 Item2 { get { return m_Item2; }
}
519 public T3 Item3 { get { return m_Item3; }
}
520 public T4 Item4 { get { return m_Item4; }
}
521 public T5 Item5 { get { return m_Item5; }
}
523 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
) {
531 public override Boolean
Equals(Object obj
) {
532 return ((IStructuralEquatable
) this).Equals(obj
, EqualityComparer
<Object
>.Default
);;
535 Boolean IStructuralEquatable
.Equals(Object other
, IEqualityComparer comparer
) {
536 if (other
== null) return false;
538 Tuple
<T1
, T2
, T3
, T4
, T5
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
, T5
>;
540 if (objTuple
== null) {
544 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
);
547 Int32 IComparable
.CompareTo(Object obj
) {
548 return ((IStructuralComparable
) this).CompareTo(obj
, Comparer
<Object
>.Default
);
551 Int32 IStructuralComparable
.CompareTo(Object other
, IComparer comparer
) {
552 if (other
== null) return 1;
554 Tuple
<T1
, T2
, T3
, T4
, T5
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
, T5
>;
556 if (objTuple
== null) {
557 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
562 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
564 if (c
!= 0) return c
;
566 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
568 if (c
!= 0) return c
;
570 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
572 if (c
!= 0) return c
;
574 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
576 if (c
!= 0) return c
;
578 return comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
581 public override int GetHashCode() {
582 return ((IStructuralEquatable
) this).GetHashCode(EqualityComparer
<Object
>.Default
);
585 Int32 IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
) {
586 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
), comparer
.GetHashCode(m_Item2
), comparer
.GetHashCode(m_Item3
), comparer
.GetHashCode(m_Item4
), comparer
.GetHashCode(m_Item5
));
589 Int32 ITupleInternal
.GetHashCode(IEqualityComparer comparer
) {
590 return ((IStructuralEquatable
) this).GetHashCode(comparer
);
592 public override string ToString() {
593 StringBuilder sb
= new StringBuilder();
595 return ((ITupleInternal
)this).ToString(sb
);
598 string ITupleInternal
.ToString(StringBuilder sb
) {
609 return sb
.ToString();
613 /// The number of positions in this data structure.
615 int ITuple
.Length
=> 5;
618 /// Get the element at position <param name="index"/>.
620 object ITuple
.this[int index
]
637 throw new IndexOutOfRangeException();
644 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
{
646 private readonly T1 m_Item1
;
647 private readonly T2 m_Item2
;
648 private readonly T3 m_Item3
;
649 private readonly T4 m_Item4
;
650 private readonly T5 m_Item5
;
651 private readonly T6 m_Item6
;
653 public T1 Item1 { get { return m_Item1; }
}
654 public T2 Item2 { get { return m_Item2; }
}
655 public T3 Item3 { get { return m_Item3; }
}
656 public T4 Item4 { get { return m_Item4; }
}
657 public T5 Item5 { get { return m_Item5; }
}
658 public T6 Item6 { get { return m_Item6; }
}
660 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
) {
669 public override Boolean
Equals(Object obj
) {
670 return ((IStructuralEquatable
) this).Equals(obj
, EqualityComparer
<Object
>.Default
);;
673 Boolean IStructuralEquatable
.Equals(Object other
, IEqualityComparer comparer
) {
674 if (other
== null) return false;
676 Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
, T5
, T6
>;
678 if (objTuple
== null) {
682 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
);
685 Int32 IComparable
.CompareTo(Object obj
) {
686 return ((IStructuralComparable
) this).CompareTo(obj
, Comparer
<Object
>.Default
);
689 Int32 IStructuralComparable
.CompareTo(Object other
, IComparer comparer
) {
690 if (other
== null) return 1;
692 Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
, T5
, T6
>;
694 if (objTuple
== null) {
695 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
700 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
702 if (c
!= 0) return c
;
704 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
706 if (c
!= 0) return c
;
708 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
710 if (c
!= 0) return c
;
712 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
714 if (c
!= 0) return c
;
716 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
718 if (c
!= 0) return c
;
720 return comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
723 public override int GetHashCode() {
724 return ((IStructuralEquatable
) this).GetHashCode(EqualityComparer
<Object
>.Default
);
727 Int32 IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
) {
728 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
));
731 Int32 ITupleInternal
.GetHashCode(IEqualityComparer comparer
) {
732 return ((IStructuralEquatable
) this).GetHashCode(comparer
);
734 public override string ToString() {
735 StringBuilder sb
= new StringBuilder();
737 return ((ITupleInternal
)this).ToString(sb
);
740 string ITupleInternal
.ToString(StringBuilder sb
) {
753 return sb
.ToString();
757 /// The number of positions in this data structure.
759 int ITuple
.Length
=> 6;
762 /// Get the element at position <param name="index"/>.
764 object ITuple
.this[int index
]
783 throw new IndexOutOfRangeException();
790 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
{
792 private readonly T1 m_Item1
;
793 private readonly T2 m_Item2
;
794 private readonly T3 m_Item3
;
795 private readonly T4 m_Item4
;
796 private readonly T5 m_Item5
;
797 private readonly T6 m_Item6
;
798 private readonly T7 m_Item7
;
800 public T1 Item1 { get { return m_Item1; }
}
801 public T2 Item2 { get { return m_Item2; }
}
802 public T3 Item3 { get { return m_Item3; }
}
803 public T4 Item4 { get { return m_Item4; }
}
804 public T5 Item5 { get { return m_Item5; }
}
805 public T6 Item6 { get { return m_Item6; }
}
806 public T7 Item7 { get { return m_Item7; }
}
808 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
) {
818 public override Boolean
Equals(Object obj
) {
819 return ((IStructuralEquatable
) this).Equals(obj
, EqualityComparer
<Object
>.Default
);;
822 Boolean IStructuralEquatable
.Equals(Object other
, IEqualityComparer comparer
) {
823 if (other
== null) return false;
825 Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>;
827 if (objTuple
== null) {
831 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
);
834 Int32 IComparable
.CompareTo(Object obj
) {
835 return ((IStructuralComparable
) this).CompareTo(obj
, Comparer
<Object
>.Default
);
838 Int32 IStructuralComparable
.CompareTo(Object other
, IComparer comparer
) {
839 if (other
== null) return 1;
841 Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>;
843 if (objTuple
== null) {
844 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
849 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
851 if (c
!= 0) return c
;
853 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
855 if (c
!= 0) return c
;
857 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
859 if (c
!= 0) return c
;
861 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
863 if (c
!= 0) return c
;
865 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
867 if (c
!= 0) return c
;
869 c
= comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
871 if (c
!= 0) return c
;
873 return comparer
.Compare(m_Item7
, objTuple
.m_Item7
);
876 public override int GetHashCode() {
877 return ((IStructuralEquatable
) this).GetHashCode(EqualityComparer
<Object
>.Default
);
880 Int32 IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
) {
881 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
));
884 Int32 ITupleInternal
.GetHashCode(IEqualityComparer comparer
) {
885 return ((IStructuralEquatable
) this).GetHashCode(comparer
);
887 public override string ToString() {
888 StringBuilder sb
= new StringBuilder();
890 return ((ITupleInternal
)this).ToString(sb
);
893 string ITupleInternal
.ToString(StringBuilder sb
) {
908 return sb
.ToString();
912 /// The number of positions in this data structure.
914 int ITuple
.Length
=> 7;
917 /// Get the element at position <param name="index"/>.
919 object ITuple
.this[int index
]
940 throw new IndexOutOfRangeException();
947 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
{
949 private readonly T1 m_Item1
;
950 private readonly T2 m_Item2
;
951 private readonly T3 m_Item3
;
952 private readonly T4 m_Item4
;
953 private readonly T5 m_Item5
;
954 private readonly T6 m_Item6
;
955 private readonly T7 m_Item7
;
956 private readonly TRest m_Rest
;
958 public T1 Item1 { get { return m_Item1; }
}
959 public T2 Item2 { get { return m_Item2; }
}
960 public T3 Item3 { get { return m_Item3; }
}
961 public T4 Item4 { get { return m_Item4; }
}
962 public T5 Item5 { get { return m_Item5; }
}
963 public T6 Item6 { get { return m_Item6; }
}
964 public T7 Item7 { get { return m_Item7; }
}
965 public TRest Rest { get { return m_Rest; }
}
967 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
, TRest rest
) {
968 if (!(rest
is ITupleInternal
)) {
969 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleLastArgumentNotATuple"));
982 public override Boolean
Equals(Object obj
) {
983 return ((IStructuralEquatable
) this).Equals(obj
, EqualityComparer
<Object
>.Default
);;
986 Boolean IStructuralEquatable
.Equals(Object other
, IEqualityComparer comparer
) {
987 if (other
== null) return false;
989 Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
>;
991 if (objTuple
== null) {
995 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
);
998 Int32 IComparable
.CompareTo(Object obj
) {
999 return ((IStructuralComparable
) this).CompareTo(obj
, Comparer
<Object
>.Default
);
1002 Int32 IStructuralComparable
.CompareTo(Object other
, IComparer comparer
) {
1003 if (other
== null) return 1;
1005 Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> objTuple
= other
as Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
>;
1007 if (objTuple
== null) {
1008 throw new ArgumentException(Environment
.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
1013 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
1015 if (c
!= 0) return c
;
1017 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
1019 if (c
!= 0) return c
;
1021 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
1023 if (c
!= 0) return c
;
1025 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
1027 if (c
!= 0) return c
;
1029 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
1031 if (c
!= 0) return c
;
1033 c
= comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
1035 if (c
!= 0) return c
;
1037 c
= comparer
.Compare(m_Item7
, objTuple
.m_Item7
);
1039 if (c
!= 0) return c
;
1041 return comparer
.Compare(m_Rest
, objTuple
.m_Rest
);
1044 public override int GetHashCode() {
1045 return ((IStructuralEquatable
) this).GetHashCode(EqualityComparer
<Object
>.Default
);
1048 Int32 IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
) {
1049 // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
1050 ITupleInternal t
= (ITupleInternal
) m_Rest
;
1051 if(t
.Length
>= 8) { return t.GetHashCode(comparer); }
1053 // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest
1054 int k
= 8 - t
.Length
;
1057 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item7
), t
.GetHashCode(comparer
));
1059 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item6
), comparer
.GetHashCode(m_Item7
), t
.GetHashCode(comparer
));
1061 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item5
), comparer
.GetHashCode(m_Item6
), comparer
.GetHashCode(m_Item7
), t
.GetHashCode(comparer
));
1063 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item4
), comparer
.GetHashCode(m_Item5
), comparer
.GetHashCode(m_Item6
), comparer
.GetHashCode(m_Item7
), t
.GetHashCode(comparer
));
1065 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
));
1067 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
));
1069 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
));
1071 Contract
.Assert(false, "Missed all cases for computing Tuple hash code");
1075 Int32 ITupleInternal
.GetHashCode(IEqualityComparer comparer
) {
1076 return ((IStructuralEquatable
) this).GetHashCode(comparer
);
1078 public override string ToString() {
1079 StringBuilder sb
= new StringBuilder();
1081 return ((ITupleInternal
)this).ToString(sb
);
1084 string ITupleInternal
.ToString(StringBuilder sb
) {
1099 return ((ITupleInternal
)m_Rest
).ToString(sb
);
1103 /// The number of positions in this data structure.
1109 return 7 + ((ITupleInternal
)Rest
).Length
;
1114 /// Get the element at position <param name="index"/>.
1116 object ITuple
.this[int index
]
1138 return ((ITupleInternal
)Rest
)[index
- 7];