将IEnumerable替换为List

本文关键字:List 替换 IEnumerable | 更新日期: 2023-09-27 18:13:40

我有一个基本的怀疑,但我自己也搞不清楚。我有一段代码,如下所示:

List<string> List = new List<string>();
            List.Add("A");
            List.Add("B");
            List.Add("sam);
            List.Add("Sed");
IEnumerable<string> names = from n in List where (n.StartsWith("S")) select n;

如果IEnumerable被替换为具体的实现,即List,为什么上面的代码要求显式转换?

。,如果我使用:

List<string> names = from n in List where (n.StartsWith("S")) select n;

有编译错误。

我可以盲目地使用Ienumerable,但是我想知道当我使用List时会发生什么?

将IEnumerable替换为List

List<T>实现IEnumerable<T>。这意味着每个列表都是可枚举的。但这种关系并不适用于相反的情况。IEnumerable<T> 实现IList<T>。有许多可枚举对象不是列表;Stack<T>, HashSet<T>,数组,Dictionary<T, K>,迭代器块等

因此,您必须使用ToList() extensión方法从可枚举对象显式地创建一个列表:

List<string> names = (from n in List where (n.StartsWith("S")) select n).ToList();

没有从IEnumerable<T>List<T>的隐式强制转换,因为IEnumerable根本不是List

如果你想把你的enumerable转换成list,使用.ToList<T>():

List<string> names = (from n in List where (n.StartsWith("S")) select n).ToList();

实际上,在调用.ToList()之前,您的集合甚至不会被枚举。

List是IEnumerable, IEnumerable不是List

理论上,在linq的情况下,表达式是表达式,而不是集合。集合通常具有有限数量的元素,而表达式只是一个函数,根据指定的规则从某个集合中选择元素。

var expression = from n in orig_collection select n;

定义一个表达式(IEnumerable),描述将应用于orig_collection

枚举的规则。

var collection = expression.ToList();

你通过orig_collection枚举到最后在进程中应用表达式。这将产生一个新的List