Round
は、2つの数字が非常に近いものの、別々のものとみなされる可能性がある状況を作り出すことができます。
は、この例を見てみましょう:
var Mylist = new []
{
new { X = 1.0000051, Y = 1.0 },
new { X = 1.0000049, Y = 1.0 },
new { X = 1.1, Y = 1.0 },
new { X = 1.0, Y = 1.005 },
};
最初の2つの値が非常に接近している - 実際に、彼らは第六小数点以下が異なります。
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();
結果は次のとおりです:
丸めはこれらの2つの値を保持することを可能にした私たちは、このコードを実行した場合どのようなことで
。
正しいアプローチは距離でフィルタリングすることです。後続の値が以前の値のしきい値内にある場合は、それを破棄する必要があります。
ここことを行うコードです:
これは、重複を除去するために、より良い最適です:我々はこれを取得Mylist
データにすることを実行した場合今
var threshold = 0.000001;
Func<double, double, double, double, double> distance
= (x0, y0, x1, y1) =>
Math.Sqrt(Math.Pow(x1 - x0, 2.0) + Math.Pow(y1 - y0, 2.0));
var result = Mylist.Skip(1).Aggregate(Mylist.Take(1).ToList(), (xys, xy) =>
{
if (xys.All(xy2 => distance(xy.X, xy.Y, xy2.X, xy2.Y) >= threshold))
{
xys.Add(xy);
}
return xys;
});
が。
問題はかなり真っ直ぐに思えます。何を試してみましたか、どこに問題がありますか? –
対応する丸めを 'new {x.X、...} 'に追加するだけです。 – CSharpie
2つの点の3つの成分x、y、zが通常同じである重複が削除されました。しかし、たとえばx = 1.1111111111109とx = 1.1111111111108の場合、2つの点が残っているので、上記の同じ文で丸め条件を追加できるかどうかを尋ねています! –