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?
Annonceindlæg fra Systematic
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).
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
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?
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
11. oktober 2004 - 15:14
#5
ArrayList (eller en anden collections klasse) er den måde man normalt løser det på.
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...
11. oktober 2004 - 15:44
#7
Prøv: ((UserDTO)Tmp[int]).myProperty
11. oktober 2004 - 15:45
#8
Du kan også lave din egen type safe collection så slipper du helt for type cast
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..."
11. oktober 2004 - 15:53
#10
Den er selvfølgelig constructed med: TmpUserlist.Add(new UserDTO());
11. oktober 2004 - 15:57
#11
Er ID en property med set i UserDTO ?
11. oktober 2004 - 15:58
#12
Normalt laver jeg: X x = new X(); x.P1 = 123; x.P2 = "ABC"; list.Add(x);
11. oktober 2004 - 18:51
#13
OK ?
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; }
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 ?
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
24. oktober 2004 - 21:21
#17
heidi> Tid at få afsluttet spørgsmålet ?
06. november 2004 - 18:37
#18
??
Kurser inden for grundlæggende programmering