Нахождение n количества ближайших точек в списке

Здесь C# новичок, работающий с Grasshopper для Rhino, поэтому некоторые типы объектов немного странные.

В настоящее время я пытаюсь найти количество ближайших точек в списке к данной точке. Я могу найти ближайшую точку, используя следующую функцию, но не могу адаптировать ее для получения нескольких ближайших точек.

public Vec3D ClosestPoint(Vec3D a, List<Vec3D>points){
  List<float> distanceList = new List<float>();
  for (int i = 0; i < points.Count(); i++){
    float distanceFloat = a.distanceTo(points[i]);
    distanceList.Add(distanceFloat);
  }
  int smallestIndex = distanceList.IndexOf(distanceList.Min());
  return points[smallestIndex];
}

Как бы я адаптировал этот код для функции ниже, где n - сколько ближайших точек найти?

public Vec3D ClosestPoints(Vec3D a, List<Vec3D>points, int n){

  } 

1 ответ

Вы можете использовать Linq, чтобы получить такой результат:

public IEnumerable<Vec3D> ClosestPoints(Vec3D a, List<Vec3D>points, int n) =>

  points.Select(point => new 
  { 
     point = point, 
     distance = a.distanceTo(point) 
  }).
  OrderBy(x = x.distance).
  Take(n).
  Select(x => x.point);

Обратите внимание, что в этом случае другой метод становится:

public Vec3D ClosestPoint(Vec3D a, List<Vec3D>points) =>
  ClosestPoints(a, points, 1).FirstOrDefault();
Другие вопросы по тегам