【问题标题】:IEnumerable: Whats does it mean in the context of OOPIEnumerable:在 OOP 的上下文中是什么意思
【发布时间】:2009-09-01 09:46:01
【问题描述】:

请考虑以下代码:

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

IEnumerable <Person> people;

我在很多程序中也看到过类似&lt;IQueryable&gt; 的东西是什么意思?

这里IEnumerable&lt;Person&gt;是什么意思?

【问题讨论】:

  • IEnumerable 是 .Net 类型,而不是 OOP 术语
  • 顺便说一句,它是 OOP(面向对象编程)而不是 OOPS。我已经编辑修复它。
  • @Aamir 你是对的。我恳求语义扩散:) - 但是,如果你问 Alan Kay 和其他一些杰出的人,OOPS 很适合它已经成为的样子。

标签: .net ienumerable


【解决方案1】:

IEnumerable&lt;T&gt;

有许多不同的方式可以存储一组事物,在列表中、在数组中、在数据库中等等。这些存储机制的一个共同点是所持有的事物可以是枚举,也就是说,每个事物都可以使用诸如foreach 之类的语言结构一个接一个地访问。

IEnumerable&lt;T&gt; 接口表示所有事物集的持有者 必须启用枚举的通用接口。因此IEnumberable&lt;Person 表示一个接口,它允许枚举一组Person 对象,而无需具体说明这些对象的实际存储方式。

IQueryable&lt;T&gt;

这是IEnumerable&lt;T&gt; 的扩展,但代表特定于 LINQ 的内容。在 LINQ 中,您可以指定一个 查询 来过滤和转换一组(或多组)项目。针对纯粹的 IEnumerable&lt;T&gt; 接口,这将被称为 LINQ to Objects,其中查询中的每个阶段最终都是对扩展方法的简单调用。

但是,对于实现IQueryable&lt;T&gt; 的对象,事情可能会更加复杂。实现IQueryable&lt;T&gt; 的对象可以与不同的 LINQ Provider 相关联,它可以以不同的方式实现 LINQ 查询的执行。例如,IQueryable&lt;Person&gt; 可以由与 LINQ-To-SQL 提供程序关联的类型实现。在这种情况下,LINQ 查询被转换为 T-SQL 查询,并针对数据库执行以获取一组项目(结果可能不一定是一组 Person 对象)。

【讨论】:

  • 简单英语的最佳答案之一
【解决方案2】:

IEnumerable 在 OOP 上下文中没有任何意义。

IEnumerableIEnumerable&lt;T&gt; 是 .NET 接口,它们仅表示可以枚举序列。实现 IEnumerableIEnumerable&lt;T&gt; 的类提供属性/方法以使枚举成为可能。

例如:

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);

【讨论】:

    【解决方案3】:

    IEnumerable&lt;T&gt; 是一种 .NET 框架类型。它只表示一个可枚举的元素序列,没有任何操作该序列的方法。许多类型都实现了这个接口——例如ICollection&lt;T&gt;IList&lt;T&gt;BindingList&lt;T&gt;——如果序列应该被视为只读,则通常使用它来代替字段或变量的具体类型。

    【讨论】:

      【解决方案4】:

      IQueryable 扩展了 IEnumerable,旨在由 LINQ 提供程序实现。您可以对任何提供者执行查询 - 即通过此接口抽象出差异提供者。它扩展了 IEnumerable 以便可以迭代查询的结果。例如使用 LastName.equals("Smith") 遍历所有 Person 对象

      IEnumerable&lt;People&gt; 表示该变量引用一个对象,该对象将允许您迭代/枚举/循环遍历 Person 对象的集合

      foreach(Person person in people)
        Console.WriteLine(person.ToString());
      

      解释起来有点复杂(Jon Skeet 在他的书中在这方面做得很好)。实现 IEnumerable 的类型基本上声明我可以为您提供一个迭代器对象(通过 GetEnumerator 接口方法),该对象公开一个 IEnumerator 接口,您可以使用该对象访问集合中的 Current 元素,并使用 MoveNext 移动到列表中的下一个元素。 foreach 构造在内部调用上述操作来实现其目的。
      the example in MSDN,自己实现一个迭代器,会更清楚。

      【讨论】:

        猜你喜欢
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-11
        相关资源
        最近更新 更多