Свободное преобразование между списком и IEnumerable



как я могу преобразовать List<MyObject> до IEnumerable<MyObject> а потом обратно?



Я хочу сделать это для того, чтобы запустить ряд операторов LINQ в списке, например.Sort()

639   6  

6 ответов:

List<string> myList = new List<string>();
IEnumerable<string> myEnumerable = myList;
List<string> listAgain = myEnumerable.ToList();

A List<T> Это IEnumerable<T>, Так что на самом деле, нет необходимости "конвертировать" a List<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

    Ничего не найдено.