Avatar billede heidi_j Nybegynder
11. oktober 2004 - 14:53 Der er 18 kommentarer

Funktion der returnere dynamisk array

Jeg har en funktion der returnere et dynamisk array, af en struct jeg selv har lavet, f.eks.:

public UserDTO[] FetchUser(...)
{
  UserDTO[] TmpUserDTO;

  while (...)
  {
    // Tilføjer noget til array'et
  }
 
  return TmpUserDTO;
}

Her går det galt, og jeg får at vide når jeg compiler:
"Use of unassigned local variable 'TmpUserDTO'"

Google og MSDN mener jeg er nød til at create den, altså noget a'la UserDTO[] TmpUserDTO = new UserDTO[X];

Men så er array'et pludselig ikke dynamisk mere(?) - eller hvordan kan jeg gøre det?
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:01 #1
Dynamisk array er kun dynamisk i den forstand at størrelsen bestemmes på runtime
ved new kaldet.

Helt ægte dynamisk kræver at du skal bruge f.eks. ArrayList (den udvider sig efter behov).
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:02 #2
public ArrayList FetchUser(...)
[
  ArrayList res = new ArrayList();
  res.Add(...);
  res.Add(...);
  res.Add(...);
  return res;
}

ArrayList er i namespace System.Collections
Avatar billede heidi_j Nybegynder
11. oktober 2004 - 15:05 #3
Okai - men jeg ville foretrække ikke at bruge arraylist, hvis det er muligt...

Jeg har forsøgt mig med noget a'la:

public UserDTO[] FetchUser(...)
{
  UserDTO[] TmpUserDTO;
  int I = 0;

  while (...)
  {
    TmpUserDTO[I] = new UserDTO();
    // Tilføjer noget til array'et
    I++;
  }
 
  return TmpUserDTO;
}

Stadig melder den samme fejl - hvorfor?
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:14 #4
Fordi du har en reference til et array som er null.

UserDTO[] tmp; // her laver du en reference til array af referencer til UserDTO som er null
tmp = new UserDTO[37]; // her allokerer du et array af referencer til UserDTO med 37 elementer og lader referencen pege på det
tmp[i] = new UserDTO(); // her alookerer du en UserDTO og lader det i'te element i arrayet som er altså er en reference pege på det
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:14 #5
ArrayList (eller en anden collections klasse) er den måde man normalt løser
det på.
Avatar billede heidi_j Nybegynder
11. oktober 2004 - 15:42 #6
Okai - nu har jeg forsøgt mig med en ArrayList, men hvordan tilgår jeg mine objekter?

Jeg har forsøgt med:

(UserDTO)Tmp[int].myProperty

Uden held...
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:44 #7
Prøv:

((UserDTO)Tmp[int]).myProperty
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:45 #8
Du kan også lave din egen type safe collection så slipper
du helt for type cast
Avatar billede heidi_j Nybegynder
11. oktober 2004 - 15:52 #9
Det første virker fint, jeg kan se mine properties, men når jeg prøver at sætte dem, får jeg en fejl:

The left-hand side of an assignment must be a variable, property or indexer

Kode: ((UserDTO)(TmpUserlist[TmpUserlist.Count-1])).ID = "noget..."
Avatar billede heidi_j Nybegynder
11. oktober 2004 - 15:53 #10
Den er selvfølgelig constructed med:

TmpUserlist.Add(new UserDTO());
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:57 #11
Er ID en property med set i UserDTO ?
Avatar billede arne_v Ekspert
11. oktober 2004 - 15:58 #12
Normalt laver jeg:

X x = new X();
x.P1 = 123;
x.P2 = "ABC";
list.Add(x);
Avatar billede arne_v Ekspert
11. oktober 2004 - 18:51 #13
OK ?
Avatar billede burningice Nybegynder
13. oktober 2004 - 17:58 #14
hvorfor ikke bruge en kombination af arraylist og normale arrays?

public UserDTO[] FetchUser(...)
{
  UserDTO[] TmpUserDTO;

  ArrayList tmpArr = new ArrayList();

  while (...)
  {
    // Tilføjer noget til array'et
    tmpArr.Add(...);
  }

  TmpUserDTO = new UserDTO[tmpArr.Count]

  for (int i = 0; i > TmpUserDTO.Lenght; i++) {
    TmpUserDTO[i] = (TmpUserDTO)tmpArr(i);
  }
 
  return TmpUserDTO;
}
Avatar billede arne_v Ekspert
13. oktober 2004 - 21:27 #15
1)

Medmindre det er en web service kan jeg ikke se hvorfor det skulle være
bedre at returnere et array fremfor en ArrayList og derfor konvertere !

2)

Selve konverteringen bør vel laves med ToArray metoden ?
Avatar billede burningice Nybegynder
13. oktober 2004 - 21:55 #16
tjo.. nu kan jeg ikke lige huske de forskellige metoder i hovedet, men mon ikke implementeringen af ToArray fungerer på samme måde?

men du har da ret i at en arraylist er udemærket, og hvis det er fordi at man ikke gider caste kan man lave en typesafe collection
Avatar billede arne_v Ekspert
24. oktober 2004 - 21:21 #17
heidi>

Tid at få afsluttet spørgsmålet ?
Avatar billede arne_v Ekspert
06. november 2004 - 18:37 #18
??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester