用List替换IEnumerable

时间:2016-10-18 04:53:31

标签: c# .net generics c#-4.0

我有一个基本的疑问,但我无法弄清楚自己。 我有一段代码如下:

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

3 个答案:

答案 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枚举到最后应用表达式。这将产生一个新的列表