Как я могу преобразовать a List<MyObject>
в a, IEnumerable<MyObject>
а затем обратно?
Я хочу сделать это, чтобы запустить серию операторов LINQ в списке, например Sort()
c#
linq
list
ienumerable
ТЗ.
источник
источник
Ответы:
источник
using System.Linq;
иначе вы не сможете ToList ()A
List<T>
- этоIEnumerable<T>
, поэтому на самом деле нет необходимости «конвертировать» aList<T>
вIEnumerable<T>
. Поскольку aList<T>
- этоIEnumerable<T>
, вы можете просто присвоитьList<T>
a переменной типаIEnumerable<T>
.С другой стороны, не все
IEnumerable<T>
- этоList<T>
вне курса, поэтому вам придется вызватьToList()
метод-член классаIEnumerable<T>
.источник
A
List<T>
уже являетсяIEnumerable<T>
, поэтому вы можете запускать операторы LINQ непосредственно для своейList<T>
переменной.Если вы не видите методы расширения LINQ, как
OrderBy()
я предполагаю, это потому, что у вас нетusing System.Linq
директивы в исходном файле.Однако вам нужно
List<T>
явно преобразовать результат выражения LINQ обратно в :источник
Кроме того: обратите внимание, что стандартные операторы LINQ (как в предыдущем примере) не изменяют существующий список -
list.OrderBy(...).ToList()
они создают новый список на основе переупорядоченной последовательности. Однако довольно легко создать метод расширения, который позволяет использовать лямбды сList<T>.Sort
:Тогда вы можете использовать:
Это обновляет существующий список таким же образом,
List<T>.Sort
как и обычно.источник
ToList
- я все же поясню.Преобразование
List<T>
вIEnumerable<T>
List<T>
реализуетIEnumerable<T>
(и многие другие, напримерIList<T>, ICollection<T>
), поэтому нет необходимости преобразовывать список обратно в IEnumerable, поскольку он уже является файломIEnumerable<T>
.Пример:
Вы также можете использовать
Enumerable.AsEnumerable()
методПреобразование
IEnumerable<T>
вList<T>
Это полезно в Entity Framework .
источник
Чтобы предотвратить дублирование в памяти, resharper предлагает следующее:
.ToList () возвращает новый неизменяемый список. Таким образом, изменения в listAgain не влияют на myList в ответе @Tamas Czinege. Это верно в большинстве случаев по крайней мере по двум причинам: это помогает предотвратить изменения в одной области, влияющие на другую область (слабая связь), и она очень удобочитаема, поскольку мы не должны проектировать код с учетом проблем компилятора.
Но есть определенные случаи, например, нахождение в замкнутом цикле или работа со встроенной системой или системой с низким объемом памяти, где следует учитывать соображения компилятора.
источник