【发布时间】:2014-10-10 19:41:57
【问题描述】:
对我来说,C#(嗯,.NET)中的IEnumerable<T> 表示可以迭代的任意数据集。它可以由任何东西支持,例如SELECT 查询的结果、数组的内容、用户在控制台中键入的字符或 Pi 的数字。数据不能被索引引用,不一定是有限的或无限的,也不能被修改。当稍后以相同方式调用时,它甚至可能是一组不同的数据,例如随机数的IEnumerable<double>。它只是像foreach 循环一样向消费者提供的少量数据。
现在考虑处理数据集的其他概念:SQL。在 SQL 中,除非明确指定,否则行的顺序不能保证并且不相关。例如,如果您执行SELECT * FROM stack_overflow_posts LIMIT 1,则数据库不会暗示您返回的行实际上是插入的第一行,也不是最旧的行。例如,您需要使用ORDER BY posted_date_time 明确排序结果。
同样的概念是否适用于 .NET 中带有IEnumerable<T> 的枚举? IEnumerable<T> 的使用是否暗示结果将始终按特定顺序产生?在我之前给出的示例中,我会说是的,顺序将被暗示,因为如果它们被列举在不同的顺序,结果将毫无意义;如果您在控制台中以与实际击键不同的顺序获取用户键入的字符,那么阅读它们有什么意义?显然 LINQ 有 OrderBy() 可以根据需要对结果进行排序,但这是显式排序,而不是隐式排序。
实现接口的类实际上承诺遵循特定模式,而不仅仅是实现接口定义的方法。 IEnumerable<T> 是否暗示其数据将按相关顺序产生,或者是否由枚举的消费者明确排序(如果他们愿意)?如果我有一种方法可以以未定义的顺序生成商品——或者更确切地说,是与消费者无关且随时可能更改的订单——我应该使用IEnumerable<T>以外的其他东西吗?
【问题讨论】:
标签: c# .net linq ienumerable