Example #1
0
        public void SimpleTupleTests()
        {
            var p = new TuplePoint(3.14, 2.71);

            (double X, double Y) = p;
            Assert.AreEqual(X, 3.14);
            Assert.AreEqual(Y, 2.71);

            var unamed = ("one", "two");

            Assert.AreEqual(unamed.Item1, "one");
            var namedTuple = (First : "one", Second : "two");

            Assert.AreEqual(namedTuple.First, "one");
            Assert.AreEqual(namedTuple.Second, "two");

            var sum          = 12.5;
            var count        = 5;
            var accumulation = (count, sum);

            Assert.AreEqual(accumulation.sum, sum);

            var localVariableOne = 5;
            var localVariableTwo = "some text";

            var testTuple = (explicitFieldOne : localVariableOne, explicitFieldTwo : localVariableTwo);

            Assert.AreEqual(testTuple.explicitFieldOne, localVariableOne);

            var left  = (a : 5, b : 10);
            var right = (a : 5, b : 10);

            Assert.AreEqual(left, right);

            // Lifted conversion
            (int a, int b)? nullableRightTuple = right;
            Assert.AreEqual(nullableRightTuple, right);

            // Nested tuples
            (int, (int, int))nestedTuple = (1, (2, 3));
            Assert.AreEqual(nestedTuple, (1, (2, 3)));

            // The 'arity' and 'shape' of all these tuples are compatible.
            // The only difference is the field names being used.
            var unnamed        = (42, "The meaning of life");
            var anonymous      = (16, "a perfect square");
            var named          = (Answer : 42, Message : "The meaning of life");
            var differentNamed = (SecretConstant : 42, Label : "The meaning of life");

            unnamed = named;
            named   = unnamed;

            // 'named' still has fields that can be referred to as 'Answer', and 'Message':
            Assert.AreEqual(named.Answer, 42);
            Assert.AreEqual(named.Message, "The meaning of life");

            anonymous = unnamed;

            // named tuples.
            named = differentNamed;
            // The field names are not assigned. 'named' still has fields that can be referred to as 'Answer' and 'Message':
            Debug.WriteLine($"{named.Answer}, {named.Message}");

            // With implicit conversions:
            // int can be implicitly converted to long
            (long, string)conversion = named;
            Assert.AreEqual(conversion.Item1, 42L);

            double standardDeviation = CoolStuff.StandardDeviationWithTuple(new List <double>()
            {
                11d, 22d, 33d, 44d, 55d, 66d, 77d, 88d, 99d, 111d
            });

            Assert.IsTrue(standardDeviation > 22d);

            // Inferred tuple element names
            int    Id                = 5;
            string LookupName        = "CN0073893";
            var    testInferredTuple = (Id, LookupName); // element names are "Id" and "LookupName"
            var    sameAsTestTuple   = (Id, LookupName);

            Assert.AreEqual(testInferredTuple.Id, Id);
            Assert.AreEqual(testInferredTuple.LookupName, LookupName);
            Assert.AreEqual(testInferredTuple, sameAsTestTuple);
            Assert.IsTrue(testInferredTuple == sameAsTestTuple);
        }