我有一個關於訂單在IEnumerable
(或IEnumerable<T>
,無所謂)的問題。IEnumerable和訂單
我們知道,通過IEnumerable的迭代是僞代碼可以通過以下方式書寫:
while (enumerable.HasNext())
{
object obj = enumerable.Current;
...
}
現在,假設,一個需要在分類收集操作。在這種情況下可以使用IEnumerable還是使用支持索引的其他方法(即IList
)更好?
換句話說:IEnumerable
的合同是否對訂單作出一般保證?
UPD:因此,IEnumerable
不適用於保證排序的通用接口。新的問題是什麼接口或類應該用於訂單不可變集合? ReadonlyCollection
? IList
?他們都包含Add()
方法(甚至沒有在前者實施)。有什麼建議?
P.S我自己的想法:IEnumerable
不提供任何有關訂購的保證。正確的實現可以在不同枚舉中以不同順序返回相同的元素(考慮SQL查詢)
P.P.S.我知道LINQ First()
,但如果IEnumerable
沒有說它的排序的話,這個擴展是相當無用的。
另一個例子是'Dictionary <,>'。它清楚地記錄了它的條目枚舉的順序是未定義的。因此,像'dict.Last().Key'這樣的代碼(其中'dict'是'Dictionary <,>'而'Last()'是LINQ擴展方法)是沒有意義的。 (我聽說有一位開發人員正在做這件事。) –
我想補充說,它對於正確理解什麼是對某些通用集合訂單的保證很重要。所以順序保證不是關於特定的順序(比如說,作爲排序的結果),而是關於保證相同集合的元素的順序對於隨後的枚舉是相同的。大多數收集不明確保證。 IList只代表一種字典,其中鍵是索引。 –
IOrderedEnumerable可能是一個標誌,認爲集合保證了順序(雖然接口仍然沒有),但它比我們需要的更多 - 它通常代表一個特定的SORT順序,而我們需要任何(隨機)順序,這只是在枚舉之間保證。總之,只有具體的實現才能真正保證順序(例如Array,List)。 –