2009-09-23 31 views
1

我想知道我是否可以假設我從IList(通過調用IEnumerable接口中的GetEnumerator方法)得到的IEnumerator將按列表順序給出項目。應如何處理.Net IList的枚舉?

您認爲如何?

回答

8

您不能,因爲IList是一個接口,並且實現可以按任意順序枚舉項目。例如,我可以實現WeirdList:IList,並以任何方式枚舉項目,包括非確定性項目。另一方面,如果您使用列表(T),它將保證按列表中存儲的順序枚舉項目。

編輯:就像其他人指出的那樣,大多數實現都遵循List(T)的語義。雖然這不是你問的;)

+1

+1大多數實現都是相似的,但基於這個事實編寫代碼將是一個巨大的錯誤。 – 2009-09-23 13:57:09

+0

我會對代碼嘗試驗證具有相當強硬語義的數據結構的語義。這對您的單元測試是可以的,以確保MyListImpl匹配IList所暗示的內容,但實際的生產代碼不應該有這些檢查。 – user7116 2009-09-23 14:04:16

0

是的,它至少會對IList的體面實施做到這一點。一個好的IList應該總是按照與列表索引相同的順序枚舉它的元素。

List<int> list = new List<int> { 1, 1, 2, 3, 5, 8 }; 

IEnumerator<int> enumtor = list.GetEnumerator(); 
while (enumtor.MoveNext()) 
{ 
    Console.Write(enumtor.Current); 
} 

打印112358

+0

實施現在有辦法保證誰實施的IList的人遵循了這一原則,也有一些例子,其中這將是有意義的,爲了不歸還。 – 2009-09-23 13:44:28

+1

沒有保證,但這是一個普遍有效的假設,它被認爲是一個有效的假設。 – Joren 2009-09-23 13:46:37

+0

我同意它應該是一個有效的假設,但經驗告訴我,程序員有時會在他們的代碼中做瘋狂的事情:) – 2009-09-23 13:50:51

0

枚舉器應該讓你訪問列表中的對象相對於它們在內存中的位置,這將與使用列表的索引器從0到長度< 1在for循環中。

編輯︰我專門回答了實現IList的.NET框架類,如果任何其他人實現這些接口,他們的實際實現可能幾乎任何東西。所以這取決於實施者。

0

這將取決於與IList