将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时会发生什么?
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