2011-03-08 6 views
8

알아요, 다른 옵션이 있습니다. 키 목록을 별도로 관리 할 수 ​​있습니다. 다른 옵션을 제안하지 마십시오. 이 문제를 해결할 수 있는지 알고 싶습니다. 제발 내가 해결하려고하는 어떤 문제인지 물어 보지 마십시오. 이것은 순수하고 간단한 CS 문제입니다.해시 테이블을 캐스팅합니다. 목록 <int> 또는 다른 IEnumerable <int>

누군가가 Hashtable에서 키를 가져와 List<int> 또는 IEnumerable<int>의 다른 유형으로 캐스팅하는 방법을 알고 있는지 알고 싶습니다 (물론 내 키는 실제로 정수입니다).

내가 문제없이이 작업을 수행 할 수 있다는 것을 감안할 때 :

foreach (int key in hashtable.Keys) 

는 왜 이런 일이 나에게 오류를 제공합니까?

(List<int>)hashtable.Keys 
+0

예외를 게시 할 수 있습니까? – Brosto

답변

16

당신이 다음을 수행하실 수 있습니다 LINQ 확장 방법이 있다면 .. 또한

List<int> keys = hashtable.Keys.Cast<int>().ToList(); 

List<int> keys = hashtable.Keys.OfType<int>().ToList(); 

자동 복싱에 따라 작동 할 수 있습니다

+1

+1. 특별한 이유는'Keys'는'ICollection' 뿐이며'IEnumerable '이 아니라'IEnumerable' 만 구현합니다. –

+1

OP가 "다른 IEnumerable '을 요청하기 때문에 ToList를 포기하고 변수를 IEnumerable (또는'var')으로 입력하면됩니다. –

+0

@ Adam Robinson 전화를 잘 주셔서 감사합니다. 설명을 추가해 주셔서 감사합니다. 현재 내가 놀랍도록 연결되어있어 내 대답을 편집하는 것이 다소 힘들어서 OP에 대한 의견을 보내 주시면 자세한 정보를 얻을 수 있습니다. –

0

hashtable.Keys 때문에 정수리스트 공변 있지 않은 오브젝트의 컬렉션이다.

+1

머리카락을 나눌 경우 공분산이 명시 적으로 필요하지 않습니다. 전환 가능성은 있습니다. –

-1

당신의 foreach 루프가 InvalidCastException가 발생합니다 Keys 컬렉션에 int이 포함되어 있지 않은 경우 컴파일러는 인, IEnumerable<TKey> 될 수있는 특정 ICollection<T>

+0

Keys가 List 인 것처럼 사용할 수있는 유형이 아니기 때문에 캐스트가 실패합니다. ICollection은 List에서 사용할 수있는 메서드를 노출시키지 않는 매우 기본적인 인터페이스입니다. – KeithS

1

hashtable.Keys 필요 foreach 때문에에 ICollection이 아닌 일반을 변환 할 수 없기 때문에

List<int>에 캐스트가 실패합니다. 그러나 hashtable.KeysList<TKey>이 아닙니다. 그것은 단순하지 않은 ICollection입니다. 목록으로 변환하기 위해 일부 Linq에 시도 :

List<int> keys = hashtable.Keys.OfType<int>().ToList(); 

이 기본적으로 키 컬렉션을 열거하고 새로운 목록에 각 요소를 추가 할 것입니다, 그때 당신에게 목록을 제공합니다. OfType()은 캐스트보다 '안전'합니다. Cast는 전체 콜렉션을 IEnumerable<int>으로 처리하려고하는데, 포함 된 요소가 null이거나 암시 적으로 정수로 캐스트 될 수없는 경우 런타임 오류 또는 예기치 않은 동작이 발생할 수 있습니다. 반대로 OfType은 소스를 반복하고 실제로 int 인 요소 만 열거 할 것입니다. 두 키가 모두 정수인 경우에만 작동합니다.

+0

'foreach'는'IEnumerable '이 아닌'IEnumerable'을 필요로합니다. –

+0

기술적으로 그렇습니다. 그러나 열거 형이 강력한 형식 인 경우 항목 형식을 해당 형식 (또는 암시 적으로 캐스트 할 수있는 형식)으로 정의해야합니다. 'foreach (int id in MyCollectionOfReferenceTypes)'와 같은 것을하려고하면 컴파일러 에러가 발생합니다. – KeithS

0

당신은 ICollection<int> keyCols = hashtable.Keys;

0

을 할 수 있습니다 비 일반 버전 대신 사전을 사용합니다. 또는 CastTo 확장 메소드를 사용하십시오. Hastable.Key가 반환 한 비 제네릭 컬렉션에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/system.collections.icollection.aspx을 참조하고 사용할 수있는 캐스팅 메소드에 대한 링크를 참조하십시오.

관련 문제