Свободно преобразуйте между Списком <T> и IEnumerable <T>

Хорошо, благодаря вам, все готово, все, что мне нужно было сделать, это изменить файл .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)
102
задан Soner Gönül 5 December 2015 в 19:27
поделиться

4 ответа

List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();
147
ответ дан Tamas Czinege 24 November 2019 в 04:32
поделиться

List<T> IEnumerable<T>, поэтому на самом деле, нет никакой потребности 'преобразовать' List<T> в IEnumerable<T>. Начиная с List<T> IEnumerable<T>, можно просто присвоиться List<T> к переменной типа IEnumerable<T>.

наоборот, не каждый IEnumerable<T> List<T> offcourse, таким образом необходимо будет звонить ToList() членский метод IEnumerable<T>.

21
ответ дан Amy B 24 November 2019 в 04:32
поделиться

В стороне: Обратите внимание, что стандартные операторы 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 обычно делает.

5
ответ дан Marc Gravell 24 November 2019 в 04:32
поделиться

Список List уже является IEnumerable, поэтому вы можете выполнять операторы LINQ непосредственно на вашей переменной List.

Если вы не видите методов расширения LINQ, таких как OrderBy(), я предполагаю, что это потому, что у вас нет директивы using System.Linq в вашем исходном файле.

Однако вам нужно явно преобразовать результат выражения LINQ обратно в List:

List<Customer> list = ...
list = list.OrderBy(customer => customer.Name).ToList()
9
ответ дан 24 November 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: