在List <T>和IEnumerable <T>之间自由转换

如何将List<MyObject>转换为IEnumerable<MyObject> ,然后再返回?

我想这样做是为了在列表上运行一系列LINQ语句,例如Sort()

 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>types的variables。

IEnumerable<T> ,不是每个IEnumerable<T>都是一个List<T> offcourse,所以你必须调用IEnumerable<T>ToList()成员方法。

List<T>已经是一个IEnumerable<T> ,所以你可以直接在你的List<T>variables上运行LINQ语句。

如果你没有看到像OrderBy()的LINQ扩展方法,我猜是因为你的源文件中没有using System.Linq指令。

尽pipe如此,您需要将LINQexpression式结果明确地转换回List<T>

 List<Customer> list = ... list = list.OrderBy(customer => customer.Name).ToList() 

另外:请注意,标准的LINQ操作符(根据前面的例子)不会改变现有的列表list.OrderBy(...).ToList()将基于重新sorting的序列创build一个新的列表。 但是,创build一个扩展方法非常简单,它允许您使用带有List<T>.Sort lambdaexpression式:

 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通常相同的方式更新现有列表。

为了防止内存中的重复,resharperbuild议这样做:

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

.ToList()返回一个新的不可变列表。 所以更改listAgain不会影响@Tamas Czinege答案myList。 在大多数情况下,这是正确的,至less有两个原因:这有助于防止影响其他区域的变化(松耦合),并且非常易读,因为我们不应该用编译器来devise代码。

但是也有一些例子,比如处于一个紧密的循环中,或者在embedded式或低内存系统上工作,在这个系统中需要考虑编译器的考虑因素。

List(T)类实现IEnumerable(T) (以及许多其他的如IList(T),ICollection(T),IEnumerable(T)),因此不需要将List转换回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中很有用。