2009-04-06 3 views
0

죄송합니다. 다시 한 번 문의하십시오. 나는 여기 몇 시간 동안 관련 주제를 읽었으며 캐스팅과 제네릭에 대한 문제를 아직 많이 얻지 못했다. .net 3.5를 사용할 수 없기 때문에 우리 자신의 HashSet 클래스를 만들려고합니다.C#에서 제네릭 형식의 개체를 캐스팅 할 수 있습니까?

오류는 아래의 RetainAll 메서드에 있습니다. 잘 컴파일되지만 런타임 오류가 발생합니다. ''System.Collections.DictionaryEntry '유형의 객체를 캐스트 할 수 없으므로 foreach 문에'mycompany.UnivID '를 입력하십시오.

일반 객체를 구현 유형으로 변환 할 수 없다는 뜻입니까? 나는 같은 것을 시도했다.

foreach ((T) obj in set) 

그러나 그들은 컴파일하지 않는다.

관련 코드는 다음과 같습니다

public sealed class HashSet<T> : ISet<T> { 

    private readonly Hashtable set; 

    public HashSet() { 
    this.set = new Hashtable(); 
    } 

    public void RetainAll(ISet<T> c) { 
    lock (set) { 
     foreach (T obj in set) { 
     if (!c.Contains(obj)) 
      this.set.Remove(obj); 
     } 
    } 
    } 
} 

구현 클래스 조각은

public sealed class UnivIDSet : ISet { 
    private readonly ISet<UnivID> univIDs; 

    public UnivIDSet() : base() { 
    univIDs = new HashSet<UnivID>(); 
    } 
} 

이며, 우리는 실제로 세트에서 객체 우리 UnivID 클래스를 가지고있다.

답변

5

난 당신이 해시 테이블을 열거 반환은 DictionaryEntry입니다 유형을 열거 할 때

foreach (T obj in set) { 

foreach (T obj in set.Values) { 
+0

예, 맞았습니다. 감사! 나는이 질문에 당황 스럽다. 나는 그 사실을 알고 있었거나 알아낼 수 있어야했습니다. – user26270

+0

하하, 우리 모두에게 발생합니다. 때로는 또 다른 한 쌍의 눈이 도움이됩니다. –

0

있어야한다고 생각합니다. 이 객체의 키 및 값 속성을 읽고 필요한 것을 얻습니다.

0

해시 테이블은 키를 값으로 매핑합니다. 해시 테이블의 각 항목을 반복 할 때 해당 항목은 키/값 쌍 (DictionaryEntry 클래스)입니다. 테이블에 항목을 입력 한 방법에 따라 대신 Keys 속성이나 Values ​​속성을 반복 할 수 있습니다.

Dictionary 클래스는 해시 테이블의 일반 버전이기 때문에 그 대신에 HashSet을 구현할 가치가 있습니다.

관련 문제