6 ответов:
List<string> myList = new List<string>(); IEnumerable<string> myEnumerable = myList; List<string> listAgain = myEnumerable.ToList();
A
List<T>ЭтоIEnumerable<T>, Так что на самом деле, нет необходимости "конвертировать" aList<T>доIEnumerable<T>. ПосколькуList<T>ЭтоIEnumerable<T>, вы можете просто назначитьList<T>переменной типаIEnumerable<T>.наоборот, не каждый
IEnumerable<T>этоList<T>конечно, так что вам придется позвонитьToList()метод членаIEnumerable<T>.
A
List<T>ужеIEnumerable<T>, Так что вы можете запускать операторы LINQ непосредственно на вашемList<T>переменной.если вы не видите методы расширения LINQ, такие как
OrderBy()Я предполагаю, что это потому что у тебя нет
в сторону: обратите внимание, что стандартные операторы 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обычно делает.
чтобы предотвратить дублирование в памяти, resharper предлагает следующее:
List<string> myList = new List<string>(); IEnumerable<string> myEnumerable = myList; List<string> listAgain = myList as List<string>() ?? myEnumerable.ToList();.ToList () возвращает новый неизменяемый список. Поэтому изменения в listAgain не влияют на myList в ответе @Tamas Czinege. Это верно в большинстве случаев по крайней мере по двум причинам: это помогает предотвратить изменения в одной области, влияющие на другую область (свободная связь), и это очень читаемо, так как мы не должны разрабатывать код с проблемами компилятора.
но есть определенные случаи, например находясь в узком цикле или работая на встроенной или низкой системе памяти, где следует учитывать соображения компилятора.
List (T) класс реализует IEnumerable (T) (и многих других таких, как IList(Т), интерфейс ICollection(т), Тип IEnumerable(Т)), следовательно, нет необходимости, чтобы преобразовать список обратно к IEnumerable.
public class Person { public int Id { get; set; } public string Name { get; set; } } Person person1 = new Person() { Id = 1, Name = "Person 1" }; Person person2 = new Person() { Id = 2, Name = "Person 2" }; Person person3 = new Person() { Id = 3, Name = "Person 3" }; List<Person> people = new List<Person>() { person1, person2, person3 }; //Converting to an IEnumerable IEnumerable<Person> IEnumerableList = people;но конвертировать из IEnumerable в List-это допустимый сценарий
IEnumerable<Person> OriginallyIEnumerable = new List<Person>() { person1, person2 }; List<Person> convertToList = OriginallyIEnumerable.ToList();это полезно в Entity Framework.
Comments