Хорошо, благодаря вам, все готово, все, что мне нужно было сделать, это изменить файл .pyx следующим образом:
cimport c_test
import numpy as np
cimport numpy as np
from libc.stdlib cimport free
np.import_array()
ctypedef void (*PyCapsule_Destructor)(void*)
cdef extern from "numpy/arrayobject.h":
void* PyCapsule_GetPointer(void* capsule, const char *name)
void* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)
int PyArray_SetBaseObject(np.ndarray arr, void* obj)
cdef void capsule_cleanup(void* capsule):
cdef void *memory = PyCapsule_GetPointer(capsule, NULL)
free(memory)
def test(n):
cdef np.ndarray arr
cdef int nd = 1
cdef np.npy_intp shape[1]
shape[0] = <np.npy_intp> n
cdef double *data = c_test.test1(n)
arr = np.PyArray_SimpleNewFromData(nd, shape, np.NPY_DOUBLE, data)
cdef void* capsule = PyCapsule_New(data, NULL, capsule_cleanup)
PyArray_SetBaseObject( arr, capsule)
return(arr)
List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();
List<T>
IEnumerable<T>
, поэтому на самом деле, нет никакой потребности 'преобразовать' List<T>
в IEnumerable<T>
. Начиная с List<T>
IEnumerable<T>
, можно просто присвоиться List<T>
к переменной типа IEnumerable<T>
.
наоборот, не каждый IEnumerable<T>
List<T>
offcourse, таким образом необходимо будет звонить ToList()
членский метод IEnumerable<T>
.
В стороне: Обратите внимание, что стандартные операторы LINQ (согласно более раннему примеру) не изменяются существующий , список - list.OrderBy(...).ToList()
создаст новый список на основе переупорядоченной последовательности. Довольно легко, однако, создать дополнительный метод, который позволяет Вам использовать лямбды с List<T>.Sort
:
static void Sort<TSource, TValue>(this List<TSource> list,
Func<TSource, TValue> selector)
{
var comparer = Comparer<TValue>.Default;
list.Sort((x,y) => comparer.Compare(selector(x), selector(y)));
}
static void SortDescending<TSource, TValue>(this List<TSource> list,
Func<TSource, TValue> selector)
{
var comparer = Comparer<TValue>.Default;
list.Sort((x,y) => comparer.Compare(selector(y), selector(x)));
}
Тогда можно использовать:
list.Sort(x=>x.SomeProp); // etc
Это обновляет существующий список таким же образом, что List<T>.Sort
обычно делает.
Список List
уже является IEnumerable
, поэтому вы можете выполнять операторы LINQ непосредственно на вашей переменной List
.
Если вы не видите методов расширения LINQ, таких как OrderBy()
, я предполагаю, что это потому, что у вас нет директивы using System.Linq
в вашем исходном файле.
Однако вам нужно явно преобразовать результат выражения LINQ обратно в List
:
List<Customer> list = ...
list = list.OrderBy(customer => customer.Name).ToList()