2012-02-28 3 views
7

Почему я могу использовать оператор VBScript for each для итерации объекта System.Collections.ArrayList, но не объекта Systems.Collections.SortedList?Понимание IEnumerable в .Net COM Interop

Учитывая следующее:

set aList = Server.CreateObject("System.Collections.ArrayList") 
aList.Add "a" 
aList.Add "b" 
aList.Add "c" 
for each item in aList 
    ' do something 
next 

set sList = Server.CreateObject("System.Collections.SortedList") 
sList.Add "a", 1 
sList.Add "b", 2 
sList.Add "c", 3 
for each item in sList 
    ' do something 
next 

Линия

for each item in sList 

аварии с

объект не поддерживает это свойство или метод *.

По этому свойству я предполагаю, что они означают _NewEnum собственности. Но почему _NewEnum выставлен ArrayList, но не SortedList? Оба класса реализуют интерфейс IEnumberable, который от разборки mscorelib.dll представляется интерфейсом, ответственным за реализацию свойства (dispId of -4).

Если кто-то может пролить свет на различные взаимодействия COM-взаимодействия этих подобных классов, я был бы очень благодарен.

Я знаю, что могу использовать другие свойства, выставленные SortedList, чтобы перебирать коллекцию. Я не спрашиваю, как итерации SortedList. Я просто спрашиваю, почему IEnumrable, похоже, не реализован в версии interop SortedList, когда она реализована в версии interop ArrayList.

ответ

3

Хотя SortedList реализует IEnumerable, он имеет перегруженный метод GetEnumerator(), который возвращает IDictionaryEnumerator. Вы должны явно указать IEnumerable для использования перегрузки, которая возвращает IEnumerator, где может быть ваша проблема.

Перечислитель по умолчанию не имеет того же поведения, что и у ArrayList - он вернет DictionaryEntry для каждого элемента, а не строки, которые вы ожидаете.

Мое предположение было бы вы, вероятно, захотите использовать свойство Values, а и что, если вы сортировкой по номерам, вы хотите использовать аргументы метода Add наоборот, т.е.

sList.Add 1, "a" 
Смежные вопросы