C#中数组已是IEnumerable类型,为何LINQ查询仍需转为该类型?
先看你给出的代码:
string[] fruits = new string[] {"apple", "plum", "cherry"}; IEnumerable<string> results = from a in fruits select a;
你问的核心点其实是:既然数组本身已经实现了IEnumerable
1. LINQ查询返回的不是原集合类型
你写的是最简单的select a,看起来和原数组内容一致,但实际上LINQ查询返回的是一个封装了查询逻辑的迭代器对象(比如System.Linq.Enumerable.WhereSelectEnumerableIterator这类内部类型),它实现了IEnumerable
IEnumerable<string> results = from a in fruits where a.Length > 5 orderby a select a;
这时候返回的对象和数组完全不是一个类型,但依然能被IEnumerable
2. 适配LINQ的延迟执行特性
LINQ查询默认是延迟执行的——只有当你遍历results(比如foreach循环、调用ToList()/ToArray())时,查询逻辑才会真正运行。这个特性是靠IEnumerable
3. 抽象解耦,提升代码灵活性
用IEnumerable
额外补充:也可以用var简化声明
你其实也可以直接用var让编译器自动推断变量类型:
var results = from a in fruits select a;
这时候results的实际类型是LINQ生成的迭代器,但它依然实现了IEnumerable
内容的提问来源于stack exchange,提问作者stackoverflowresearchk879

