请考虑以下代码:
public class Person
(
public string FirstName {get; set;}
public string LastName {get; set;}
Public int Age {get; set;}
}
IEnumerable <Person> people;
此外,我在许多程序中看到类似<IQueryable>
的含义是什么意思?
这里IEnumerable<Person>
的含义是什么?
答案 0 :(得分:4)
<强> IEnumerable<T>
强>
可以通过许多不同的方式存储一组的东西,在List中,在数组中,在数据库中等等。这些存储机制的一个共同点就是持有的事物可以是枚举,也就是说,每个人都可以使用语言结构(例如foreach
)一个接一个地访问。
IEnumerable<T>
接口表示 thing 的所有持有者必须启用枚举的公共接口。因此IEnumberable<Person
表示一个接口,允许枚举一组Person
个对象,而不具体说明这些对象的实际存储方式。
<强> IQueryable<T>
强>
这是IEnumerable<T>
的扩展,但代表LINQ特有的内容。在LINQ中,您可以指定可以过滤和转换一组(或多组)项目的查询。对于纯粹的IEnumerable<T>
接口,这将被称为LINQ to Objects,其中查询中的每个阶段最终都是对扩展方法的简单调用。
然而,对于实现IQueryable<T>
的对象,事情可能更复杂。实现IQueryable<T>
的对象可以与不同的LINQ 提供程序相关联,这可以以不同的方式实现LINQ查询的执行。例如,IQueryable<Person>
可以由与LINQ-To-SQL提供者相关联的类型实现。在这种情况下,LINQ查询将转换为针对数据库执行的T-SQL查询以获取一组项(结果可能不一定是一组Person
个对象。)
答案 1 :(得分:3)
IEnumerable
在OOP的上下文中没有任何意义。
IEnumerable
和IEnumerable<T>
是.NET接口,只是表明可以枚举序列。实现IEnumerable
或IEnumerable<T>
的类提供了使枚举成为可能的属性/方法。
例如:
IEnumerable<Person> people = GetPeopleFromSomewhere();
// iterate through the sequence
foreach (Person p in people)
{
Console.WriteLine(p.Name);
}
// use LINQ to query the sequence
var peopleOver30 = people.Where(p => p.Age > 30);
答案 2 :(得分:0)
IQueryable扩展了IEnumerable,旨在由LINQ提供程序实现。您可以对任何提供程序执行查询 - 即通过此接口抽象出差异提供程序。它扩展了IEnumerable,以便可以迭代Query的结果。例如使用LastName.equals(“Smith”)循环遍历所有Person对象
IEnumerable<People>
表示变量引用的对象允许您迭代/枚举/循环Person对象的集合
foreach(Person person in people)
Console.WriteLine(person.ToString());
解释起来有点复杂(Jon Skeet在他的书中做得很好)。实现IEnumerable的类型基本上声明我可以为您提供一个迭代器对象(通过GetEnumerator接口方法)公开IEnumerator接口,您可以使用该接口访问集合中的Current元素和MoveNext以移动到列表中的下一个元素。 foreach构造内部调用上述操作来实现其目的 请参阅the example in MSDN,自己实现一个迭代器,它会更清楚。
答案 3 :(得分:0)
IEnumerable<T>
是.NET框架类型。它只代表一个可枚举的元素序列,没有任何操作序列的方法。许多类型实现此接口 - 例如ICollection<T>
,IList<T>
和BindingList<T>
- 如果序列应被视为读取,则通常使用它来代替字段或变量的具体类型 - 只。