c# - Remove duplicates in a list of XYZ points -
mylist.groupby(x => new{x.x, x.y}).select(g => g.first()).tolist<xyz>();
the above code works fine me. want compare points based on round(5) of point component.
for example x.x = 16.838974347323224
should compared x.x = 16.83897
because experienced inaccuracy after round 5. suggestions?
solution:
mylist.groupby(x => new { x = math.round(x.x,5), y = math.round(x.y,5) }) .select(g => g.first()).tolist();
to use math.round
:
var result = mylist.groupby(x => new { x = math.round(x.x,5, midpointrounding.awayfromzero), y = math.round(x.y,5, midpointrounding.awayfromzero) }) .select(g => g.first()).tolist();
however if want remove duplicates instead of groupby
go 1 of these:
select
rounded ,distinct
:var result = mylist.select(item => new xyz { x = math.round(item.x,5, midpointrounding.awayfromzero), y = math.round(item.y,5, midpointrounding.awayfromzero)}) .distinct().tolist();
distinct
, overrideequals
,gethashcode
- (equals rounding) - wouldn't suggestdistinct
, implement customiequalitycomparer
:public class roundedxyzcomparer : iequalitycomparer<xyz> { public int roundingdigits { get; set; } public roundedxyzcomparer(int roundingdigits) { roundingdigits = roundingdigits; } public bool equals(xyz x, xyz y) { return math.round(x.x, roundingdigits, midpointrounding.awayfromzero) == math.round(y.x, roundingdigits, midpointrounding.awayfromzero) && math.round(x.y,roundingdigits, midpointrounding.awayfromzero) == math.round(y.y, roundingdigits, midpointrounding.awayfromzero); } public int gethashcode(xyz obj) { return math.round(obj.x, roundingdigits, midpointrounding.awayfromzero).gethashcode() ^ math.round(obj.y, roundingdigits, midpointrounding.awayfromzero).gethashcode(); } } //use: mylist.distinct(new roundedxyzcomparer(5));
Comments
Post a Comment