2009-04-06 22 views
0

もう一度申し訳ありません。私はここ数時間、関連するトピックを読んできましたが、キャスティングやジェネリックに関する問題はまだまだありません。私はまだ.net 3.5を使用することができないので、独自のHashSetクラスを作成しようとしています。C#でジェネリック型にオブジェクトをキャストできますか?

エラーは、以下のRetainAllメソッドにあります。それはうまくコンパイルされますが、実行時エラーが発生します 'タイプ' System.Collections.DictionaryEntry 'のオブジェクトをキャストして、' mycompany.UnivID 'をforeach文に入力できません。

これは、汎用オブジェクトをその実装タイプにキャストできないということですか?私はいくつかのようなものを試しました

foreach ((T) obj in set) 

しかし、それらはコンパイルされません。実装したクラスのスニペットは

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

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

ある

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); 
     } 
    } 
    } 
} 

し、我々は実際にセットでのオブジェクトである私たちのUnivIDクラスを持っている:

関連するコードです。

答えて

5

は、私はあなたがハッシュテーブルに列挙子を返しますがDictionaryEntryあるタイプを列挙すると

foreach (T obj in set) { 

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

はい、それでした。ありがとう!私は今質問に少し恥ずかしいです。私は知っていたか、それを理解するべきだったはずです。 – user26270

+0

ハハは、私たちすべてに起こります。時には別の目のペアが役立ちます。 –

0

されるべきだと思います。このオブジェクトのキーと値のプロパティを読み、必要なものを取得します。

0

ハッシュテーブルはキーを値にマップします。ハッシュテーブルの各アイテムを繰り返し処理するとき、そのアイテムはキー/値のペアです(DictionaryEntryクラスと同じです)。おそらく、テーブルに物事を入力した方法に応じて、代わりにKeysプロパティまたはValuesプロパティを反復処理する必要があります。

Dictionaryクラスはハッシュテーブルのジェネリックバージョンですので、代わりにその代わりにHashSetを構築する価値があります。

関連する問題