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
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
namespace UsingExceptInCSharp;
namespace UsingExceptInCSharp;

public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public string Name { get; set; } = string.Empty;
public int Age { get; set; }
public string Department { get; set; }
}
public string Department { get; set; } = string.Empty;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System.Diagnostics.CodeAnalysis;

namespace UsingExceptInCSharp;

public class EmployeeComparer : IEqualityComparer<Employee>
Expand All @@ -12,11 +10,5 @@ public bool Equals(Employee? x, Employee? y)
return x.ID == y.ID && x.Name == y.Name && x.Age == y.Age && x.Department == y.Department;
}

public int GetHashCode([DisallowNull] Employee obj)
{
var hashID = obj.ID.GetHashCode();
var hashName = obj.Name.GetHashCode();

return hashID ^ hashName;
}
}
public int GetHashCode(Employee obj) => HashCode.Combine(obj.ID, obj.Name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace UsingExceptInCSharp;

public record EmployeeRecord(int ID, string Name, int Age, string Department);
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,27 @@ public List<Employee> GetEmployeesNotInSales()
return empNotInSales;
}

public List<int> GetDistinctDifference()
{
int[] first = [1, 1, 2, 3, 3, 4];
int[] second = [3];

return first.Except(second).ToList();
}

public List<Employee> GetEmployeesNotInSalesFromCopies()
{
List<Employee> salesCopies = new()
{
new Employee {ID = 1, Name = "John Doe", Age = 28, Department = "Sales"},
new Employee {ID = 2, Name = "Emily Sanders", Age = 29, Department = "Sales"},
new Employee {ID = 3, Name = "Benjamin Winters", Age = 30, Department = "Sales"},
new Employee {ID = 12, Name = "Mary Jane", Age = 35, Department = "Sales"}
};

return employees.Except(salesCopies).ToList();
}

public List<string> GetEmployeesNotInITIgnoreCase()
{
var employeesNotInIT = employees.Select(e => e.Name)
Expand All @@ -47,4 +68,26 @@ public List<Employee> GetEmployeesNotInSalesUsingComparer()

return employees.Except(employeesInSales, comparer).ToList();
}
}

public List<EmployeeRecord> GetEmployeeRecordsNotInSales()
{
List<EmployeeRecord> staff = new()
{
new EmployeeRecord(1, "John Doe", 28, "Sales"),
new EmployeeRecord(4, "Sheila Foxx", 31, "Marketing"),
new EmployeeRecord(6, "Grace Jones", 32, "IT")
};

List<EmployeeRecord> sales = new()
{
new EmployeeRecord(1, "John Doe", 28, "Sales")
};

return staff.Except(sales).ToList();
}

public List<Employee> GetEmployeesNotInITByID()
{
return employees.ExceptBy(employeesIT.Select(e => e.ID), e => e.ID).ToList();
}
}
13 changes: 11 additions & 2 deletions csharp-linq/UsingExceptInCSharp/UsingExceptInCSharp/Program.cs
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
using UsingExceptInCSharp;

var examples = new ExceptMethodExamples();

Console.WriteLine(string.Join(", ", examples.GetDistinctDifference()));
Console.WriteLine(examples.GetEmployeesNotInSales().Count);
Console.WriteLine(examples.GetEmployeesNotInSalesFromCopies().Count);
Console.WriteLine(examples.GetEmployeesNotInSalesUsingComparer().Count);
Console.WriteLine(string.Join(", ", examples.GetEmployeeRecordsNotInSales().Select(e => e.Name)));
Console.WriteLine(string.Join(", ", examples.GetEmployeesNotInITIgnoreCase()));
Console.WriteLine(string.Join(", ", examples.GetEmployeesNotInITByID().Select(e => e.Name)));
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand All @@ -10,10 +10,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
<PackageReference Include="coverlet.collector" Version="10.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.11.0" />
<PackageReference Include="MSTest.TestAdapter" Version="4.5.2" />
<PackageReference Include="MSTest.TestFramework" Version="4.5.2" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,29 +16,46 @@ public void GivenAllEmployees_WhenExceptInvoked_ThenVerifyThatNoSalesEmployeesRe
var sheilaRecord = nonSales.Find(i => i.Name == "Sheila Foxx");

Assert.IsInstanceOfType(nonSales, typeof(List<Employee>));
Assert.HasCount(8, nonSales);
Assert.IsNull(maryRecord);
Assert.IsNotNull(sheilaRecord);
}

[TestMethod]
public void GivenDuplicatesInFirstSequence_WhenExceptInvoked_ThenVerifyThatResultIsDistinct()
{
var result = _examples.GetDistinctDifference();

CollectionAssert.AreEqual(new List<int> { 1, 2, 4 }, result);
}

[TestMethod]
public void GivenCopiesOfSalesEmployees_WhenExceptInvokedWithoutComparer_ThenVerifyThatNothingIsRemoved()
{
var result = _examples.GetEmployeesNotInSalesFromCopies();

Assert.HasCount(12, result);
}

[TestMethod]
public void GivenAllEmployees_WhenExceptInvokedIgnoreCase_ThenVerifyThatNoITEmployeesReturned()
{
var nonIT = _examples.GetEmployeesNotInITIgnoreCase();

Assert.IsNotNull(nonIT);
Assert.IsInstanceOfType(nonIT, typeof(List<string>));
Assert.IsFalse(nonIT.Contains("ava knowles"));
Assert.IsFalse(nonIT.Contains("grace jones"));
Assert.HasCount(10, nonIT);
Assert.DoesNotContain("Ava Knowles", nonIT);
Assert.DoesNotContain("Grace Jones", nonIT);
}

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void GivenAllEmployees_WhenExceptInvokedAgainstNull_ThenVerifyThatExceptionThrown()
{
var numbers = new List<int> { 1, 2, 3, 4 };
List<int> emptyList = null;
List<int>? nullList = null;

var result = numbers.Except(emptyList);
Assert.ThrowsExactly<ArgumentNullException>(() => numbers.Except(nullList!));
}

[TestMethod]
Expand All @@ -50,7 +67,26 @@ public void GivenAllEmployees_WhenExceptInvoked_ThenVerifyThatNoSalesEmployeesRe
var comparison = _employeeComparer.Equals(expectedRecord, sheilaRecord);

Assert.IsInstanceOfType(nonSales, typeof(List<Employee>));
Assert.HasCount(8, nonSales);
Assert.IsTrue(comparison);
Assert.IsNotNull(sheilaRecord);
}
}

[TestMethod]
public void GivenRecords_WhenExceptInvokedWithoutComparer_ThenVerifyThatValueEqualityIsUsed()
{
var result = _examples.GetEmployeeRecordsNotInSales();

CollectionAssert.AreEqual(new List<string> { "Sheila Foxx", "Grace Jones" }, result.Select(e => e.Name).ToList());
}

[TestMethod]
public void GivenITEmployeeIDs_WhenExceptByInvoked_ThenVerifyThatNoITEmployeesReturned()
{
var result = _examples.GetEmployeesNotInITByID();

Assert.HasCount(10, result);
Assert.IsNull(result.Find(e => e.ID == 6));
Assert.IsNull(result.Find(e => e.ID == 7));
}
}
Loading