Laden...

Generisches Integer Array

Erstellt von nilres vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.932 Views
N
nilres Themenstarter:in
60 Beiträge seit 2010
vor 13 Jahren
Generisches Integer Array

Hallo Leute,

erstmal etwas Code (sagt hier glaube ich mehr als tausend Worte):


public void Calculate(Int32[] indices) {
   // Mache ganz viel nach Schema:
   Daten[Indices[25]];
}

public void Calculate(Int16[] indices) {
    var indices32 = new Int32[indices.Length];
    indices.CopyTo(indices32, 0);
    Calculate(indices32);
}

Wie ihr seht ist mein Problem, dass ich als Eingabe entweder Int16- oder Int32-Arrays bekomme und diese dann gleich verarbeite. Ist es möglich das geschickter zu lösen? Kann man evtl. auch das kopieren noch besser lösen oder habe ich da bereits die optimale Lösung? Ich finde sie ziemlich hässlich.

Grüße
Nils

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo nilres,

verwende eine generische Methode mit ICollection<T> als Parameter.

herbivore

N
nilres Themenstarter:in
60 Beiträge seit 2010
vor 13 Jahren

Erstmal danke für den Hinweis.

Leider gibt es bei ICollection<T> ja keine Möglichkeit auf die Elemente zuzugreifen, oder? Indexer fehlt und ich sehe auch keine andere Mehtode an die Daten ran zu kommen ohne die Collection komplett per Enumerator durch zu laufen.

Grüße
Nils

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo nilres,

verwende eine generische Methode mit IList<T> als Parameter.

herbivore

5.299 Beiträge seit 2008
vor 13 Jahren

Hi!

vermutlich willst du mit den int16/int32 rechnen?
Dann geht das mit der generischen Methode nicht, weil int16 und int32 kein gemeinsames Interface haben, welches die Rechen-Operatoren definiert, welches man also als Einschränkung für die generische Methode angeben könnte.

(OT):
Finde ich einen interessanten Gedanken: Könnte man nicht theoretisch beim Anlegen eines Operators automatisch ein entsprechendes Interface als implementiert definieren, sodaß man etwa generische SummenFunktionen schreiben könnte

T Sum<T>(IEnumerable<T> items)where T: IAddable{
   var retVal=default<T>;
   foreach(var itm in items)retVal+=itm;
   return retVal;
}

und damit könnte man ints, doubles, strings und TimeSpans aufsummieren?

Der frühe Apfel fängt den Wurm.

N
nilres Themenstarter:in
60 Beiträge seit 2010
vor 13 Jahren

Hallo ihr beiden.
Ich dachte es würde durch den ersten Post deutlich werden. Ich verwende das Array um Indices für ein anderes Array zu finden.

Beispiel Indices ist mein Array was ich gerne etwas generalisiert haben möchte:


clas A {
    String Data[]; // Irgendwie mit ganz tollen sachen befüllt;
    void Calculate(Int32[] indices) {
         Verarbeite(Data[indices[25]]);
    }
    void Calculate(Int16[] indices) {
         Verarbeite(Data[indices[25]]);
    }
}


Das können je nachdem 16bit oder 32bit indices sein (das lässt sich nicht ändern, ist so). Und deswegen kommt auch eine einfache IList<T> Mehtode nicht in Frage, denn auch da bekomme ich dann:

Eine implizite Konvertierung vom Typ "T" in "int" ist nicht möglich.

Ist jetzt deutlich geworden was ich möchte?

Ich denke inzwischen übrigens auch, dass es nicht möglich ist.

Grüße
Nils

771 Beiträge seit 2009
vor 13 Jahren

Doch das müßte mit einer IList<T> (wie von herbivore vorgeschlagen) funktionieren.
Und bzgl. der Fehlermeldung: dort fehlt dann evtl. eine "explizite" Konvertierung.

Bezogen auf dein letztes Beispiel also:


string Data[];

void Calculate<T>(IList<T> indices)
{
    int index = Convert.ToInt32(indices[25]);
    Verarbeite(Data[index]);
}

Bei einem Aufruf mit "nicht zu int konvertierbaren Typen" kriegst du dann selbstverständlich eine Exception.

N
nilres Themenstarter:in
60 Beiträge seit 2010
vor 13 Jahren

Ok das könnte wirklich funktionieren - Danke.

5.299 Beiträge seit 2008
vor 13 Jahren

auch könnte man nur eine Methode, und nur für IEnumerable<int32> anbieten, und die muß man halt mit

Calculate(int16Indicees.Cast<int32>())

aufrufen, wenn die Indicees int16 sind.
Oder eine Überladung, die die andere mit diesem Cast aufruft.

Der frühe Apfel fängt den Wurm.