Avatar billede jesperwerge Nybegynder
27. december 2007 - 22:18 Der er 14 kommentarer og
2 løsninger

Fjerne/finde null værdier i array

Hej

jeg har et array der max kan have 5 tekst værdier, men det er vilkårligt hvor der findes en værdi.

Eksempel:
tmpArray[0] = "billede1.jpg";
tmpArray[1] = "";
tmpArray[2] = "billede3.jpg";
tmpArray[3] = "billede4.jpg";
tmpArray[4] = "";

Jeg vil gerne fylde et nyt array som skal indeholde de værdier fra tmpArray der ikke er null eller "" som værdi.

hvordan vil i gøre det dynamisk?

Min tanke er at tælle de værdier der ikke er null eller "", for at finde længden på det nye array, og herefter sætte værdierne i det nye array - giver det overhovede mening?

/werge
Avatar billede martinbk Nybegynder
27. december 2007 - 22:28 #1
List<string> stringList = new List<string>();
for(int i=0;i<tmpArray.Length;i++) {
if(tmpArray[i] != null && tmpArray[i] != "") {
    stringlist.Add(tmpArray[i])
}

string[] tmp2Array = stringList.ToArray();
Avatar billede arne_v Ekspert
27. december 2007 - 22:28 #2
Hvorfor ikke bruge en collection f.eks. List<string> ?
Avatar billede arne_v Ekspert
27. december 2007 - 22:35 #3
For sent.

Jeg ville dog lave det som:

List<string> tmpList = (new List<string>(tmpArray)).FindAll(delegate(string s) { return s != null && s != ""; });

i 2.0 (og det må kunne laves endnu nemmere i 3.5)
Avatar billede martinbk Nybegynder
27. december 2007 - 22:40 #4
men som arne siger, hvorfor ikke bruge en Collection som selv tilpasser sig, og ja arne din måde er da smartere, dog nok en del sværere at forstå (hvis det da er et krav fra spørger)
Avatar billede arne_v Ekspert
27. december 2007 - 22:45 #5
Jep.

Men 3.5 måderne er endnu mere krøllede.

Med lambda:

List<string> tmpList = (new List<string>(tmpArray)).FindAll( (string s) => s != null && s != "" );

Med LINQ:

List<string> tmpList = new List<string>(from s in tmpArray where s != null && s != "" select s);
Avatar billede jesperwerge Nybegynder
27. december 2007 - 22:53 #6
Hej begge,

Først tak for hurtig svar.

Det er 2.0 - og jeg har testet begge jeres forslag, de virker. Tak
Jeg ved ikke helt hvorfor jeg valgte Array frem to List, men nu er det ændret til List :)

jeg vil benytte mig af arne_v forslag, men i må dele points, da begge virker

jeg er ikke helt sikker på jeg forstår brugen af delegate(string s) - er det muligt med en mindre forklaring?

/werge
Avatar billede arne_v Ekspert
27. december 2007 - 23:03 #7
Man kalder FindAll med en metode der kaldes på alle elementer i listen og returnerer
enten true eller false for om den skal med i output.
Avatar billede jesperwerge Nybegynder
27. december 2007 - 23:14 #8
tillægs spøgsmål:

jeg har opbygget et objekt med forskellige værdier og blandt andet den her List af billede referencer. dette viser jeg i en asp:repeater hvor jeg viser det første billeder i List - men hvordan vælger man det første i Listen?

før med array: <asp:Image ID="img" Width="50px" ImageAlign="Right" runat="server" ImageUrl='<%# Eval("Img", "Images/" + Eval("PartnerRefID") + "/" + Eval("BilID") + "/{0}") %>' />

hvordan ville i gøre dette når det er en List?
Avatar billede jesperwerge Nybegynder
27. december 2007 - 23:15 #9
tak for forklaring arne_v - vil du ikke lige smide et svar, tak

Martinbk - smid et svar, tak
Avatar billede arne_v Ekspert
27. december 2007 - 23:20 #10
svar
Avatar billede arne_v Ekspert
27. december 2007 - 23:21 #11
Jeg er ikke sikker på at jeg forstår tillægs spørgsmålet. Du kan indexerer dig i
en List<> med [index] ligesom med et array. Men jeg kan ikke gennemskue dit asp:Image tag.
Avatar billede martinbk Nybegynder
27. december 2007 - 23:32 #12
kommer her
Avatar billede jesperwerge Nybegynder
28. december 2007 - 09:42 #13
Hej Arne,

det er mig der misforstår, det skal være det samme som ved et array.

den eneste forskel er at der skal stå Img[0] istedet for Img i selve ImageUrl værdien.

tak for hjælpen til jer begge.
Avatar billede md_craig Nybegynder
28. december 2007 - 12:53 #14
RemoveAll er vel et alternativ, eller nærmere det du vil eller ?...

Virker som med FindAll men returnere ikke en ny liste, istedet fjerner den alle matches og returnere en int som fortæller hvor mange den har fjernet...

Og kan man ikke bruge string.IsNullOrEmpty?

Noget ala:

List<string> results = new List<string>(tmpArray);
results.RemoveAll( string s => string.IsNullOrEmpty(s) );

eller:

List<string> tmpList = (new List<string>(tmpArray)).FindAll( (string s) => string.IsNullOrEmpty(s) );

Gør det det ikke en smule pænnere? :)
(Har stadig ikke fået fingrene i VS2008, eller rettere taget mig sammen til at downloade 2008 Express...
Avatar billede md_craig Nybegynder
28. december 2007 - 12:58 #15
igen kan man vel:

string[] results = Array.FindAll<string>(tmpArray, s => !string.IsNullOrEmpty(s) );

Skal lige prøve at se nærmere på det sennere... er lige blevet lidt nysgering selv...
Avatar billede arne_v Ekspert
30. december 2007 - 05:44 #16
IsNullOrEmpty er absolut pænere.

RemoveAll er absolut en mulighed - jeg har ingen præferencer for hverken FindAll eller
RemoveAll.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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