2012-02-28 3 views
7

VBScript for each 문을 사용하여 System.Collections.ArrayList 개체를 반복 할 수 있지만 Systems.Collections.SortedList 개체를 반복 할 수없는 이유는 무엇입니까? 주어진 다음의.Net COM Interop에서 IEnumerable을 이해하십시오.

:

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 속성을 의미하는 가정합니다. 그런데 _NewEnumArrayList에 노출되는 이유는 무엇입니까? SortedList은 노출되지 않습니다. 두 클래스 모두 mscorelib.dll을 분해하여 _NewEnum 속성 (dispId-4)을 구현하는 인터페이스 인 것처럼 보이는 IEnumberable 인터페이스를 구현합니다.

누구나 이러한 비슷한 클래스의 서로 다른 COM interop 동작에 대해 설명 할 수 있다면 매우 감사 할 것입니다.

나는 SortedList에 의해 노출 된 다른 속성을 사용하여 컬렉션을 반복 할 수 있음을 알고 있습니다. SortedList을 반복하는 방법을 묻지 않습니다. 나는 단지 IEnumrableArrayList의 interop 버전으로 구현 될 때 SortedList의 interop 버전에서 구현되지 않는 것일 뿐이라고 묻는 것이다.

답변

3

SortedList는 IEnumerable을 구현하지만 IDictionaryEnumerator를 반환하는 오버로드 된 GetEnumerator() 메서드가 있습니다. 귀하의 문제가있는 곳에서 IEnumerator를 반환하는 오버로드를 사용하려면 명시 적으로 IEnumerable로 캐스팅해야합니다.

기본 열거자는 ArrayList와 동일한 동작을하지 않습니다. 예상 한 문자열 대신 각 항목에 대해 DictionaryEntry를 반환합니다.

은 내 생각 엔 당신은 아마 대신 값 속성을 사용하고자하는 것입니다 그리고 당신은 숫자로 정렬하는 경우 즉, 당신은 추가 메소드 인수를 주변의 다른 방법을 사용하고자하는 즉

sList.Add 1, "a" 
관련 문제