[C#] multi array van typeloze object to [,] string

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik krijg van een methode een "typeloze" object terug waarbij je duidelijk kan zien dat het een 2dimensionele array is.

Nu wil ik dit objectje downcasten naar een multidimensionele array string maar hier zit ik met een probleempje.

Ik heb het al proberen te casten via de "gewone" weg en via "convert.to" zonder succes.

Wanneer ik van dit topic vertrek loop ik tegen het dimensioneren van de nieuwe array aan.

Dus eerst vorm ik de resultaten van de reader (index 0 van een arraylist van typeloze multi array objectjes) naar een Array om.
C#:
1
2
3
 
Array res =  reader.Results[0] as Array;
 

Hierna moet ik "res" in een string[,] dumpen en vermits ik niet weet hoe je de dimensie kan bepalen voor een nieuwe string[,] zoals in het vermelde topic...
C#:
1
2
3
 
string[,] results = new string[???];
 

En het onderstaande een exception veroorzaakt...
C#:
1
2
3
 
string[,] results = (string[,])res;
 

Message="Unable to cast object of type 'System.Object[,]' to type 'System.String[,]'."

...ben ik ten einde raad.

Of zoek ik het nu te ver ?

Sorry als er iets niet duidelijk is maar ik vind het best moeilijk te omschrijven.

Acties:
  • 0 Henk 'm!

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Waarschijnlijk kom je een eind met de methoden GetLowerBound en GetUpperBound van de klasse Array.

Voorbeeld:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
            object[,] res = (object[,])reader.Results[0];
            int uBound0 = res.GetUpperBound(0);
            int uBound1 = res.GetUpperBound(1);

            string[,] strRes = new string[uBound0, uBound1];

            for (int x = 0; x <= uBound0; x++)
            {
                for (int y = 0; y <= uBound1; y++)
                {
                    strRes[x, y] = (string)res[x, y];
                }
            }

[ Voor 71% gewijzigd door Face_-_LeSS op 12-08-2009 12:54 . Reden: Opmerking ctor ]


Acties:
  • 0 Henk 'm!

Verwijderd

De bounds moeten nog wel +1:
C#:
1
2
3
object[,] arr = new object[4, 2];
            int b1 = arr.GetUpperBound(0);
            int b2 = arr.GetUpperBound(1);

Zullen resp. 3 en 1 teruggeven, als je deze dus rechtstreeks in je for-loop gebruikt mis je 1 item.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GetUpperBound is wat ik nodig had, dat komt ervan als je altijd met arraylists werkt :(

Mijn dank is groot !

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Kleine tip, om niet telkens +1 te hoeven doen kun je voor het aanmaken van een array natuurlijk ipv GetUpperBound GetLenght(0) en GetLenght(1) gebruiken (tbh snap ik het nut van ubound niet).

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

roy-t schreef op woensdag 12 augustus 2009 @ 14:46:
(tbh snap ik het nut van ubound niet).
't Is natuurlijk wel een semantisch verschil. Een array die loopt van 0 t/m 4 heeft een lengte van 5 maar een upper bound van 4. Een array die daarentegen loopt van 1 t/m 5 heeft zowel een lengte als een upperbound van 5.

Nou kon je in VB vroeger arrays bij 1 laten beginnen, ik weet niet of dat in .Net ook nog kan? Maar in dat opzichte is GetLength() dus niet hetzelfde als GetUpperBound() + 1

.edit: uit de docs over Array
The Array class is the base class for language implementations that support arrays. However, only the system and compilers can derive explicitly from the Array class. Users should employ the array constructs provided by the language.

An element is a value in an Array. The length of an Array is the total number of elements it can contain. The rank of an Array is the number of dimensions in the Array. The lower bound of a dimension of an Array is the starting index of that dimension of the Array; a multidimensional Array can have different bounds for each dimension.
Er zouden dus Array implementaties kunnen bestaan die niet bij 0 beginnen.

[ Voor 38% gewijzigd door .oisyn op 12-08-2009 14:59 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
.oisyn schreef op woensdag 12 augustus 2009 @ 14:53:
[...]
Nou kon je in VB vroeger arrays bij 1 laten beginnen, ik weet niet of dat in .Net ook nog kan?
Het typeloze (wat is hier de juiste benaming voor) array objectje dat ik van de reader terug krijg begint bij 1, dus ik neem aan dat dit nog steeds kan ..

edit: had je edit net gemist .oisyn

[ Voor 4% gewijzigd door Verwijderd op 12-08-2009 15:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

roy-t schreef op woensdag 12 augustus 2009 @ 14:46:
Kleine tip, om niet telkens +1 te hoeven doen kun je voor het aanmaken van een array natuurlijk ipv GetUpperBound GetLenght(0) en GetLenght(1) gebruiken (tbh snap ik het nut van ubound niet).
Ach, natuurlijk, wat stom van me :)
Pagina: 1