我有一个基本的疑问,但我无法弄清楚自己。 我有一段代码如下:
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时发生了什么?
答案 0 :(得分:4)
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();
答案 1 :(得分:3)
IEnumerable<T>
到List<T>
没有隐式广播,因为IEnumerable
根本不是List
。
如果要将可枚举转换为列表,请使用.ToList<T>()
:
List<string> names = (from n in List where (n.StartsWith("S")) select n).ToList();
实际上,在您致电.ToList()
之前,甚至不会列举您的收藏。
答案 2 :(得分:0)
List是IEnumerable,IEnumerable不是List
理论上,在linq的情况下,你的表达是错误的表达,而不是集合。集合通常具有有限数量的元素,而表达式只是通过指定规则从某个集合中选择元素的函数。
写作
var expression = from n in orig_collection select n;
定义一个表达式(IEnumerable),描述将应用于orig_collection枚举的规则
写作
var collection = expression.ToList();
通过orig_collection枚举到最后应用表达式。这将产生一个新的列表