Announcement

Collapse
No announcement yet.

HashTable: Probleme beim Konstruktor

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • HashTable: Probleme beim Konstruktor

    Hallo Leute,

    ich versuche HashTable nachzuprogrammieren. Nur beim instanziieren von einer benötigten ArrayList spuckt mir Visual Studio die Fehlermeldung aus, dass der Typ Pair nicht generisch verwendet werden kann und nicht vergleichbar wäre. Folglich ein Codesnippet:

    [highlight=csharp]using System;
    using System.Collections;

    namespace Datenstrukturen
    {
    public class HashTable<TKey, TValue>
    {
    internal class Pair<TPairKey, TPairValue>
    {
    public TPairKey Key { get; private set; }
    public TPairValue Value { get; set; }

    public Pair(TPairKey key, TPairValue value)
    {
    Key = key;
    Value = value;
    }
    }

    private ArrayList<Pair<TKey, TValue>>[] items;
    public int Count { get; private set; }

    public HashTable(int length = 0)
    {
    length = length == 0 ? 500 : length;
    length = getNextPrime(length);
    items = new ArrayList<Pair<TKey, TValue>>[length]; //Nicht möglich
    }

    }[/highlight]

    Der Fehler taucht in der letzten Zeile auf:
    Der Typ "Datenstrukturen.HashTable<TKey,TValue>.Pair<TKey, TValue>" kann nicht als Typparameter "T" im generischen Typ oder in der generischen Methode "Datenstrukturen.ArrayList<T>" verwendet werden. Es ist keine implizite Verweiskonvertierung von "Datenstrukturen.HashTable<TKey,TValue>.Pair<TKey, TValue>" in "System.IComparable" vorhanden.

    Ich kann natürlich auf meine eigene ArrayList zugreifen und aus der die Schnittstelle IComparable aus dem Datentyp T entfernen, nur denn müsste ich dort auch auf einige Properties verzichten. Ich glaube nicht, dass das der Sinn der Sache ist.

    Hat jemand vielleicht einen Rat, wie ich das Problem in der HashTable ansonsten leicht beheben könnte?

    Lieben Gruß
    Zuletzt editiert von kogen; 18.06.2015, 09:00.

  • #2
    private ArrayList<Pair<TKey, TValue>>[] items;
    Eine generische ArrayList? Das gibts nicht. Oder hast du eine programmiert? Lass bei ArrayList das Wort Array weg. Die generische Liste heißt einfach List<T>.

    Edit: Falls du tatsächlich eine generische ArrayList programmiert hast zeig die mal. Vermutlich hat die eine Einschränkung auf IComparable für mindestens einen seiner generischen Parameter.
    Unglücklich wäre dann auch das Pair, neben dem das sie IComparable nicht implementiert, eine internal class von HashTable ist du sie aber außerhalb verwenden willst.
    Zuletzt editiert von Ralf Jansen; 18.06.2015, 11:15.

    Comment


    • #3
      Hey Ralf,

      vielen Dank für deine Antworten (auch im Thread http://entwickler-forum.de/showthrea...124#post281124)!

      Ich habe die Pair-Klasse nun auf private gesetzt und hier ebenfalls die Schnittstelle IComparable implementiert. Der Fehler ist somit verschwunden. Ich muss mich später denn nur noch mal an die CompareTo-Methode ransetzen.

      Die generische ArrayList gibt es wirklich nicht, mein Fehler! Ich habe hier auf meine eigene ArrayList zugegriffen, in der der generische Datentyp T, wie oben vermutet, die Einschränkung auf IComparable hat:
      [highlight=csharp]class ArrayList<T>: IEnumerable where T:IComparable
      {
      private T[] list;
      public int Count { get; private set; }

      public ArrayList(int length = 0)
      {
      list = new T[length == 0 ? 4 : length];
      Count = 0;
      }

      ...
      }[/highlight]

      Lieben Gruß

      Comment

      Working...
      X