На первом шаге вам нужно создать класс, который реализует IEqualityComparer
для вашего CS3DLines
класса.
Это может выглядеть примерно так:
public class CS3DComparer : IEqualityComparer {
public bool Equals(CS3DLines a, CS3DLines b) {
return IsSameLineIn3D(a, b);
}
public int GetHashCode(CS3DLines line){
// You do not need to use all properties of line to calculate the
// hashCode. If performance is not good enough you can experiment by
// adding and removing properties from the hash code calculation.
var hashCode = line.Property1?.GetHashCode() ?? 0;
hashCode = (hashCode * 397) ^ (line.Property2?.GetHashCode() ?? 0);
hashCode = (hashCode * 397) ^ (line.Property3?.GetHashCode() ?? 0);
return hashCode;
}
}
Далее, чтобы получить несортированный список всех элементов в вашей коллекции ListParallelLines
, вы можете вызвать этот код:
var singles = ListParallelLines
.GroupBy(line => line, new CS3DComparer())
.Where(group => group.Count() == 1)
.Select(group => group.Key)
.ToList();
singles
теперь представляет собой список всех строк, которые не имеют дубликатов в ListParallelLines
.
Для возможного ускорения при распараллеливании вы можете попробовать использовать PLINQ, запустив LINQ Query с вызовом AsParallel()
.
var singles = ListParallelLines
.AsParallel()
.GroupBy(line => line, new CS3DComparer())
.Where(group => group.Count() == 1)
.Select(group => group.Key)
.ToList();