'How to remove duplicates from a list of nested objects?
I know there are many answers out there suggesting overriding equals and hashcode, but in my case, that is not possible because the objects used are imported from DLLs.
First, I have a list of objects called DeploymentData.
These objects, along other properties, contain the following two: Location(double x, double y, double z) and Duct(int id).
The goal is to remove those that have the same Location parameters.
First, I grouped them by Duct, as a Location can not be the same if it's on another duct.
var groupingByDuct = deploymentDataList.GroupBy(x => x.Duct.Id).ToList();
Then the actual algorithm:
List<DeploymentData> uniqueDeploymentData = new List<DeploymentData>();
foreach (var group in groupingByDuct) {
   uniqueDeploymentData 
      .AddRange(group 
      .Select(x => x)
      .GroupBy(d => new { d.Location.X, d.Location.Y, d.Location.Z })
      .Select(x => x.First()).ToList());
}
This does the work, but in order to properly check that they are indeed duplicates, the entire location should be compared. For this, I've made the following method:
private bool CompareXYZ(XYZ point1, XYZ point2, double tolerance = 10)
{
   if (System.Math.Abs(point1.X - point2.X) < tolerance &&
       System.Math.Abs(point1.Y - point2.Y) < tolerance &&
       System.Math.Abs(point1.Z - point2.Z) < tolerance) {
      return true;
   }
   return false;
}
BUT I have no idea how to apply that to the code written above. To sum up:
- How can I write the algorithm above without all those method calls?
 - How can I adjust the algorithm above to use the 
CompareXYZmethod for a better precision? - Efficiency?
 
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|
