IEnumerable:它在OOP的背景下是什么意思

时间:2009-09-01 09:46:01

标签: .net ienumerable

请考虑以下代码:

public class Person
(
    public string FirstName {get; set;}
    public string LastName  {get; set;}
    Public int Age  {get; set;}
}

IEnumerable <Person> people;

此外,我在许多程序中看到类似<IQueryable>的含义是什么意思?

这里IEnumerable<Person>的含义是什么?

4 个答案:

答案 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的上下文中没有任何意义。

IEnumerableIEnumerable<T>是.NET接口,只是表明可以枚举序列。实现IEnumerableIEnumerable<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> - 如果序列应被视为读取,则通常使用它来代替字段或变量的具体类型 - 只。