Обновление
Если коллекция List<>
, то мы можем сделать одноразовое отражение в базовом массиве, как это
static FieldInfo f_items = typeof(List<Point3D>).GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance);
static FieldInfo f_size = typeof(List<Point3D>).GetField("_size", BindingFlags.NonPublic | BindingFlags.Instance);
и затем используйте его код каждый раз, когда мы хотим преобразовать как List<Point3D>
в Point3D
, как это
Point3D[] array = f_items.GetValue(list) as Point3D[];
int size= (int)f_size.GetValue(list);
Тогда вы можете продолжить с кодом ниже. Если коллекции IEnumerable<>
- это что-то другое, вам нужно сначала выяснить, как элементы хранятся внутри.
Оригинал
Я думаю, что если вы можете ограничить себя массивами вместо IEnumerable<>
, тогда вы сможете достичь более высоких скоростей.
Вот пример кода, который является компактным и должен работать как можно быстрее.
public struct Point3D
{
public double x, y, z;
}
public static class Extensions
{
public static ICoordinate[] ToCoord(this Point3D[] points, int size)
{
size = Math.Min(points.Length,size); //make sure there are enough points
ICoordinate[] res = new ICoordinate[size];
for (int i = 0; i < size; i++)
{
res[i] = new Coordinate(points[i].x, points[i].y, points[i].z);
}
return res;
}
}
class Program
{
static void Main(string[] args)
{
Point3D[] array1 = new Point3D[N];
// Fill the array ..
ICoordinate[] array2 = array1.ToCoord();
}
}