2013-10-13 2 views
1

IDictionary에서 가져온 값을 사용하여 키와 IList로 IList를 만들어야합니다. 어떻게해야합니까? 제네릭 (목록 <> 및 사전 <>)은 컴파일 타임에 알 수없는 사용자 정의 유형이기 때문에 제 거해야했습니다.C# IDictionary를 두 ILIST로 변환

DataTable을 처리하고 사전을 반환하는 메서드가 있습니다. 사전 키 유형은 런타임에 정의됩니다.

DataTable myDataTable = .... 
Type dictionaryKeysType=Type.GetType("myType"); 
IDictionary myDictionary = ProcessDataTable (myDataTable, dictionaryKeysType); 
IList keys= (IList)myDictionary.Keys; 
IList values= (IList)myDictionary.Values; 

어떻게해야합니까? 제네릭 (목록 <> 및 사전 <>)은 컴파일 타임에 알 수없는 사용자 정의 유형이기 때문에 제 거해야했습니다. 그래서, 방법 althought는 '사전 <>는'반환, 나는 선언 캔트 :

Dictionary<dictionaryKeysType, int> myDictionary = ProcessDataTable (myDataTable, dictionaryKeysType) 

그래서 나는 'IDictionary'로 받아야합니다. '사전'에 캐스팅하려고 할 때 나중에 문제가 발생하는 것처럼 'var'를 사용하는 것은 해결책이 아닙니다.

내 코드는 컴파일되지만 IList로 변환 할 때 예외가 발생합니다. 예를 들어 "myType"이 "uint"인 경우 다음과 같이 표시됩니다. ('KeyCollection [System.UInt32, System.Int32]'유형의 개체를 'System.Collections.IList'유형으로 변환 할 수 없습니다.

, 도와주세요 :(

+1

'dic.Keys.ToList();와'd.Values.ToList();와 함께 사용하면 두 개의 병렬 목록이 생성됩니다. –

+0

죄송합니다 : (첫 번째 선택 이었지만 ICollection IDictionary는 .ToList()를 구현하지 않습니다. – Kaikus

답변

1

나는 제안,

IList keys = myDictionary.Keys.ToList(); 
IList values = myDictionary.Values.ToList(); 

이 포함되어 있는지 확인하십시오 :

using System.Linq; 

를 파일의 맨 위에

이 있습니다. .ToList() 확장 메소드에 액세스 할 수 있습니다.

+0

미안 해요 :하지만 그건 내 첫 번째 선택이지만 ICollection IDictionary는 .ToList()를 구현하지 않습니다. – Kaikus

+0

그것은 ' t 자체로하지만 System.Linq의 확장 메서드는 원하는 작업을 수행 할 수있는 .ToList() 메서드를 제공합니다. 위의 편집 된 게시물 참조 – Baldrick

+0

왜 그런지 모르겠지만 Linq를 사용하고 있습니다. 나는 'private dictionary Dictionary foo() {}'와 II가 'IDictionary myDict = foo ()'에서 데이터를 받는다. (나는 컴파일 타임에 T 타입을 알지 못하기 때문에해야만한다. 그리고 'MakeGenericMethod' 'Invoke'). 'myDict.Keys'는 'ToList()'를 구현하지 않습니다. ( – Kaikus