在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中很有用。