[C# ASP.NET] Inhoud Array van files tellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een script gemaakt dat een array maakt aan de hand van de inhoud van een map met bestanden.
Wat ik nu wil is de inhoud tellen (dat wordt dan een int) en een random nummer genereren. Het heeft namelijk als doel om een random image te laten zien op de pagina.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
        ArrayList a = new ArrayList();
        DirectoryInfo info = new DirectoryInfo(Server.MapPath("~/Images"));
        FileInfo[] finfo = info.GetFiles();

       [u]// De inhoud van de array moet ik tellen en dan een random nummer genereren[/u]


        foreach (FileInfo fi in finfo)
        {
            a.Add("~/Images/" + fi.Name);
        }
        this.DataList2.DataSource = a;
        this.DataList2.DataBind();


Ik heb al heel wat en heel lang zitten knutselen. Bijna alle random image scripts zijn in VB geschreven maar ik ben nu eenmaal in c# begonnen :).

Misschien is het zelfs ook wel handig om inplaats van een Datalist gewoon een asp image veld te gebruiken. Hopelijk kan iemand mij verder helpen om ook dat te realiseren, want ik bedenk me dat ik maar 1 plaatje wil en niet alles uit desbetreffende map

[ Voor 3% gewijzigd door Verwijderd op 15-02-2008 21:42 ]


Acties:
  • 0 Henk 'm!

  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

Wat heb je zelf al geprobeerd dan ?
Het komt een beetje over alsof je wilt dat wij je script gaan schrijven.
Je zou het tellen natuurlijk in de foreach loop kunnen doen (zeker niet de netste en eenvoudigste oplossing, maar nu heb je niets)
Als je finfo intypt dan komt er een intellisense venstertje, heb je daar al in gekeken?

Voor een random nummer generatie zijn toch randomize functies uitgevonden? Dat bestaat in C# ook

[ Voor 11% gewijzigd door KoW op 15-02-2008 22:33 ]


Acties:
  • 0 Henk 'm!

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 16-09 17:37
C#:
1
2
3
4
5
6
7
//Aantal elementen van de array
int amount = finfo.Length;

//Random getal tussen de 0 en de lengte
 int randomGetal = 0;
 Random r = new Random();
 randomGetal = r.Next(0, amount);

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
KoW schreef op vrijdag 15 februari 2008 @ 22:29:
Wat heb je zelf al geprobeerd dan ?
Het komt een beetje over alsof je wilt dat wij je script gaan schrijven.
Je zou het tellen natuurlijk in de foreach loop kunnen doen (zeker niet de netste en eenvoudigste oplossing, maar nu heb je niets)
Als je finfo intypt dan komt er een intellisense venstertje, heb je daar al in gekeken?

Voor een random nummer generatie zijn toch randomize functies uitgevonden? Dat bestaat in C# ook
Klopt. Daar heb je gelijk in.
Ik heb geprobeerd te tellen dmv een foreach loop. Maar het wilde gewoon niet lukken en dat lag voornamelijk aan het feit dat ik verkeerde definities opgaf. Ook heb ik helemaal over het hoofd gezien dat je de Length van de array kan toewijzen aan een int.

Ik probeerde aan de hand van een aantal vbscripts de boel om te zetten, erg omslachtig in mijn geval.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
DoDo schreef op vrijdag 15 februari 2008 @ 22:32:
C#:
1
2
3
4
5
6
7
//Aantal elementen van de array
int amount = finfo.Length;

//Random getal tussen de 0 en de lengte
 int randomGetal = 0;
 Random r = new Random();
 randomGetal = r.Next(0, amount);
Bedankt, deze code zorgt dus voor een random getal aan de hand van de lengte.

Nu ga ik dit getal zelf niet gebruiken als bestandsnaam, maar de bedoeling is eigenlijk dat door middel van een loop door de array, dat als randomGetal is gevonden, het plaatje op die locatie uit de array op de site geplaatst word.

Zelf heb ik dit gemaakt maar ik krijg alle plaatjes op het scherm ipv 1.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
//Loop door de array tot we de juiste hebben
        int Loopje = 1;

        foreach (FileInfo fi in finfo)
            if (Loopje == randomGetal)
            {
                a.Add("~/Images/Random/" + fi.Name);
            }
            else
            {
                Loopje++;
            }


Het werkt dus nog niet naar behoren. Heb ik iets fout gedaan in de foreach loop? Of kan het misschien anders.

Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 20:37

BM

Moderator Spielerij
Verwijderd schreef op vrijdag 15 februari 2008 @ 23:04:
[...]


Bedankt, deze code zorgt dus voor een random getal aan de hand van de lengte.

Nu ga ik dit getal zelf niet gebruiken als bestandsnaam, maar de bedoeling is eigenlijk dat door middel van een loop door de array, dat als randomGetal is gevonden, het plaatje op die locatie uit de array op de site geplaatst word.

Zelf heb ik dit gemaakt maar ik krijg alle plaatjes op het scherm ipv 1.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
//Loop door de array tot we de juiste hebben
        int Loopje = 1;

        foreach (FileInfo fi in finfo)
            if (Loopje == randomGetal)
            {
                a.Add("~/Images/Random/" + fi.Name);
            }
            else
            {
                Loopje++;
            }


Het werkt dus nog niet naar behoren. Heb ik iets fout gedaan in de foreach loop? Of kan het misschien anders.
probeer dit eens ;)
C#:
1
a.Add("~/Images/Random/" + finfo[randomGetal].Name);


Ben je gelijk van die onnodige loop af :)

[ Voor 3% gewijzigd door BM op 15-02-2008 23:10 ]

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 14-09 14:42

dominic

will code for food

Kleine tip. Gebruik in loops nooit string concatenation dmv:

fout:
code:
1
string mystring = string1 + string2 + "bla" + string3


Een veel betere performance en memory footprint geeft:

goed
code:
1
string mystring = new StringBuilder(string1).Append(string2).Append("bla").Append(string3).ToString();

Download my music on SoundCloud


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BM schreef op vrijdag 15 februari 2008 @ 23:10:
[...]


probeer dit eens ;)
C#:
1
a.Add("~/Images/Random/" + finfo[randomGetal].Name);


Ben je gelijk van die onnodige loop af :)
Werkt als een zonnetje!
Ik heb slechts nog basiskennis op het moment dus wist niet zo snel dat je op die manier het randomGetal er even bij kon pakken :).
Bedankt voor de reacties.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dominic schreef op vrijdag 15 februari 2008 @ 23:12:
Kleine tip. Gebruik in loops nooit string concatenation dmv:

fout:
code:
1
string mystring = string1 + string2 + "bla" + string3


Een veel betere performance en memory footprint geeft:

goed
code:
1
string mystring = new StringBuilder(string1).Append(string2).Append("bla").Append(string3).ToString();
bedankt voor de tip. Gelukkig gaat het hier om een klein scriptje. Maar ik snap het en gaat het notitieblok in :).

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
dominic schreef op vrijdag 15 februari 2008 @ 23:12:
Kleine tip. Gebruik in loops nooit string concatenation dmv:

fout:
code:
1
string mystring = string1 + string2 + "bla" + string3


Een veel betere performance en memory footprint geeft:

goed
code:
1
string mystring = new StringBuilder(string1).Append(string2).Append("bla").Append(string3).ToString();
Hmm....
Het hant er vanaf hoe 'groot' die loop is.
Een StringBuilder instantieren kost nl. ook. :)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 14-09 14:42

dominic

will code for food

whoami schreef op zaterdag 16 februari 2008 @ 10:31:
[...]

Hmm....
Het hant er vanaf hoe 'groot' die loop is.
Een StringBuilder instantieren kost nl. ook. :)
Doorgaans is 1 iteratie is al genoeg om over te stappen naar StringBuilder.

Bij string concatenation dmv + wordt voor iedere string de je aanmaakt een object een string-object aangemaakt (duh), maar bij het 'plakken' worden de tot dan toe aan elkaar geplakte strings ook weer in een nieuw string-object gegooid.

In feite zorgt iedere + voor een nieuw (en steeds groter wordend) string-object.

Ik zal even op zoek gaan naar de bron, want dit heb ik natuurlijk ook gewoon ergens gelezen.

Download my music on SoundCloud


Acties:
  • 0 Henk 'm!

Verwijderd

dominic schreef op zaterdag 16 februari 2008 @ 12:22:
[...]
Doorgaans is 1 iteratie is al genoeg om over te stappen naar StringBuilder.
Hoewel ik dat niet helemaal geloof, is er nog een ander nadeel.
Als ik een tekstbox probeer te vullen met string:
code:
1
this.Textbox.Text = "Hallo " + username;

of ik doe dit via een StringBuilder:
code:
1
2
3
4
StringBuilder sb = new StringBuilder();
sb.Append("Hallo ");
sb.Append(username);
this.Textbox.Text = "Hallo " + sb.ToString();

of jouw voorbeeld:
code:
1
this.Textbox.Text = (new StringBuilder()).Append("Hallo ").Append(username).ToString();


Dan kies ik toch voor de eerste... die vind ik namelijk wel een stuk simpeler.

[ Voor 9% gewijzigd door Verwijderd op 16-02-2008 12:40 ]


Acties:
  • 0 Henk 'm!

Verwijderd

In Delphi was/ben ik gewend om gewoon string concatenation te gebruiken (strings zijn niet immutable in Delphi), maar in C# gebruik ik vrijwel uitsluitend StringBuilders.

Klein voorbeeldje: een code generator die een class library genereert aan de hand van de tabellen in een database, resulterend in 65000 regels code.
Met concatenation duurde dat 20 minuten, met een StringBuilder.................. 4 seconden!

Acties:
  • 0 Henk 'm!

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 14-09 14:42

dominic

will code for food

Verwijderd schreef op zaterdag 16 februari 2008 @ 13:48:
In Delphi was/ben ik gewend om gewoon string concatenation te gebruiken (strings zijn niet immutable in Delphi), maar in C# gebruik ik vrijwel uitsluitend StringBuilders.

Klein voorbeeldje: een code generator die een class library genereert aan de hand van de tabellen in een database, resulterend in 65000 regels code.
Met concatenation duurde dat 20 minuten, met een StringBuilder.................. 4 seconden!
Dat soort tests heb ik ook zelf uitgevoerd om te bewijzen tegenover mezelf dat het echt sneller zou zijn. Het scheelt inderdaad een heleboel.

Download my music on SoundCloud


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik ben het met Afterlife en dominic eensch; een stringbuilder is vele malen performanter. Maaaar, daar wil ik wel bij zeggen dat een micro-optimalisatie zoals deze (Debbus demonstreert dat mooi) natuurlijk compleet zinloos is als je effe een tekstbox wil vullen met 2 aaneengeplakte strings. Ook als dat misschien wel 5 keer voor komt. Pas bij flinke aantallen gaat het zich echt lonen en je code leesbaar(der) houden is ook wat waard. En daarmee heb ik omslachtig gezegd dat ik het al eensch was met whoami's post eerder :)

Maar we gaan off-topic ;)

[ Voor 8% gewijzigd door RobIII op 16-02-2008 15:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Geef elk object dat wat met strings doet z'n eigen StringBuilder. Dan is de overhead minimaal, en je performance optimaal.

Acties:
  • 0 Henk 'm!

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 20-08 21:38
Lijkt me ook weer overbodig :). Een hoop domein object doen dingetjes als voor en achternamen samenvoegen. Een string.Concat of string.Format is dan toch écht wel wat goedkoper als al die objecten een StringBuilder geven. In alle gevallen wordt namelijk de ontiegelijk dure constructor van de StringBuilder aangeroepen(die met 3 argumenten). Deze doet een behoorlijke set met checks en data collectie(inclusief unsfe calls op het string-object).
Daarnaast leent het object zich niet echt voor reusage.

Ik geloof daarnaast niet in dergelijk regels. 'Elk' en 'Altijd' zijn absoluut uit den boze in computer science. Uitzonderingen zijn altijd te bekkenen en vaak dichterbij als je denkt.

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


Acties:
  • 0 Henk 'm!

Verwijderd

Uit mijn ervaring is de ctor van een StringBuilder minder duur dan 't boxing/unboxing van concatenations of string formats. Maar your mileage may vary...

Acties:
  • 0 Henk 'm!

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 20-08 21:38
Een hele snelle bench laat mij zien dat het pas boven de 10 miljoen interessant wordt, het verschil tussen het contatineren van 2 stringetjes. In het nadeel van de StringBuilder overigens.
Dus voor de hierboven beschreven gevallen, zeker als het weinig voorkomt is het niet zo interessant. Het wordt wat anders als je hele teksten op gaat bouwen.

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


Acties:
  • 0 Henk 'm!

Verwijderd

/me is wel benieuwd naar die bench...

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Als je eht echt goed wil doen, doe je het zo natuurlijk:

Java:
1
2
3
StringBuilder sb = new StringBuilder();
sb.Append("Hallo " + username);
this.Textbox.Text = sb.ToString();


;)

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 20-08 21:38
Heb de test wat uitgebreid en iets representatiever gemaakt:
http://sitecore.alexiasof...and-string-concatenation/

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Hydra schreef op maandag 18 februari 2008 @ 11:38:
Als je eht echt goed wil doen, doe je het zo natuurlijk:

Java:
1
2
3
StringBuilder sb = new StringBuilder();
sb.Append("Hallo " + username);
this.Textbox.Text = sb.ToString();


;)
Aangezien het wel een C# topic is:

C#:
1
Textbox.Text = String.Format("Hallo {0}", username)

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
Las net afgelopen week op The Daily WTF dat String.Format intern ook gewoon een StringBuilder gebruikt (en heb het ook met Reflector gecontroleerd).

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 17-09 14:45

sopsop

[v] [;,,;] [v]

YakuzA schreef op dinsdag 19 februari 2008 @ 12:00:
[...]

Aangezien het wel een C# topic is:

C#:
1
Textbox.Text = String.Format("Hallo {0}", username)
Daar is niks C# 's aan hoor. Gaat ook prima in VB.net.
Pagina: 1