Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions snippets/csharp/tuples/tuples/Person.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,76 @@ public static void Deconstruct(this Student s, out string first, out string last
}
#endregion
}

namespace TupleEquality
{
public static class Tests
{
public static void EqualityTests()
{
Person nil = default;
Person blank = new Person(null, null);
Person sample = new Person("Bill", "Wagner");

Console.WriteLine("Starting Equality Tests");
Console.WriteLine($"nil equals nil: {nil == nil}");
Console.WriteLine($"nil equals blank: {nil == blank}");
Console.WriteLine($"nil equals sample: {nil == sample}");

Console.WriteLine($"blank equals nil: {blank == nil}");
Console.WriteLine($"blank equals blank: {blank == blank}");
Console.WriteLine($"blank equals sanple: {blank == sample}");

Console.WriteLine($"sample equals nil: {sample == nil}");
Console.WriteLine($"sample equals blank: {sample == blank}");
Console.WriteLine($"sample equals sanple: {sample == sample}");

Console.WriteLine($"nil not equals nil: {nil != nil}");
Console.WriteLine($"nil not equals blank: {nil != blank}");
Console.WriteLine($"nil not equals sample: {nil != sample}");

Console.WriteLine($"blank not equals nil: {blank != nil}");
Console.WriteLine($"blank not equals blank: {blank != blank}");
Console.WriteLine($"blank not equals sanple: {blank != sample}");

Console.WriteLine($"sample not equals nil: {sample != nil}");
Console.WriteLine($"sample not equals blank: {sample != blank}");
Console.WriteLine($"sample not equals sanple: {sample != sample}");

}
}
public class Person
{
public string FirstName { get; }
public string LastName { get; }

public Person(string first, string last)
{
FirstName = first;
LastName = last;
}

public void Deconstruct(out string firstName, out string lastName)
{
firstName = FirstName;
lastName = LastName;
}

// <SnippetEqualityTests>
public override bool Equals(object other) =>
(other is Person p)
? (FirstName, LastName) == (p.FirstName, p.LastName)
: false;

public static bool operator ==(Person left, Person right) =>
(object.ReferenceEquals(left, null))
? (object.ReferenceEquals(right, null))
: left.Equals(right);

public static bool operator !=(Person left, Person right) => !(left == right);
public override int GetHashCode() => (LastName, FirstName).GetHashCode();
// </SnippetEqualityTests>

}

}
67 changes: 65 additions & 2 deletions snippets/csharp/tuples/tuples/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ static void Main(string[] args)

AssignmentStatements();

var sample = new List<double>{ 2.0, 4.0, 6.0, 8.0 };
var sample = new List<double> { 2.0, 4.0, 6.0, 8.0 };

Console.WriteLine(StatisticsVersionOne.StandardDeviation(sample));

Expand Down Expand Up @@ -43,6 +43,69 @@ static void Main(string[] args)

FunWithProjections();

// Declare different members and tuples:

SimpleTupleEquality();
NullableTupleEquality();
MemberConversions();
MemberNameConversions();

TupleEquality.Tests.EqualityTests();
}

private static void SimpleTupleEquality()
{
// <SnippetEquality>
var left = (a: 5, b: 10);
var right = (a: 5, b: 10);
Console.WriteLine(left == right); // displays 'true'
// </SnippetEquality>
}

private static void NullableTupleEquality()
{
// <SnippetNullableEquality>
var left = (a: 5, b: 10);
var right = (a: 5, b: 10);
(int a, int b)? nullableTuple = right;
Console.WriteLine(left == nullableTuple); // Also true
// </SnippetNullableEquality>
}

private static void MemberConversions()
{
// <SnippetMemberConversions>
// lifted conversions
var left = (a: 5, b: 10);
(int? a, int? b) nullableMembers = (5, 10);
Console.WriteLine(left == nullableMembers); // Also true

// converted type of left is (long, long)
(long a, long b) longTuple = (5, 10);
Console.WriteLine(left == longTuple); // Also true

// comparisons performed on (long, long) tuples
(long a, int b) longFirst = (5, 10);
(int a, long b) longSecond = (5, 10);
Console.WriteLine(longFirst == longSecond); // Also true
// </SnippetMemberConversions>
}

private static void MemberNameConversions()
{
// <SnippetMemberNames>
(int a, string b) pair = (1, "Hello");
(int z, string y) another = (1, "Hello");
Console.WriteLine(pair == another); // true. Member names don't participate.
Console.WriteLine(pair == (z: 1, y: "Hello")); // warning: literal contains different member names
// </SnippetMemberNames>

//<SnippetNestedTuples>
(int, (int, int)) nestedTuple = (1, (2, 3));
Console.WriteLine(nestedTuple == (1, (2, 3)) );
// </SnippetNestedTuples>

// Value based equality tests (Person)
}

private static void FunWithProjections()
Expand Down Expand Up @@ -72,7 +135,7 @@ private static void FunWithProjections()
Console.WriteLine(projections.Item2);
// Accessing the third field:
Console.WriteLine(projections.Item3);
// There is no semantic name 'Item`.
// There is no semantic name 'Item1`.

var pt1 = (X: 3, Y: 0);
var pt2 = (X: 3, Y: 4);
Expand Down
2 changes: 1 addition & 1 deletion snippets/csharp/tuples/tuples/packages.config
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="System.ValueTuple" version="4.3.0-preview1-24530-04" targetFramework="net452" />
<package id="System.ValueTuple" version="4.5.0-rc1" targetFramework="net452" />
</packages>
5 changes: 2 additions & 3 deletions snippets/csharp/tuples/tuples/tuples.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.3.0-preview1-24530-04\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
<Private>True</Private>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0-rc1\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
Expand Down