[c#] Ubound (Array) ?

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:30
Na een hoop aanrommelen en zoeken ben ik erachter gekomen (eindelijk :)) dat c# geen Ubound equivalent heeft.

Nu heb ik het e.e.a. uitgeschreven en ik vraag me af of dit wel efficient is.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string bericht = "";
bericht +="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. |-|";
bericht +="Nulla quis nisl ac nisl molestie vehicula. Sit amet ipsum.|-|";
bericht +="Suspendisse ut mi. Quisque a turpis.|-|";

string delimStr = "|-|";
char [] delimiter = delimStr.ToCharArray();

string [] split = null;
split = bericht.Split(delimiter);

int num_breaks = 0;

for(int x = 1; x < split.Length;x++)
   {
       num_breaks++; //bevat 9 op het einde van de loop
   }

//delimStr.Length = 3
num_breaks = num_breaks / delimStr.Length; // bevat 3
Debug.WriteLine("numbreaks: " + num_breaks);


Edit: wat dingetjes aan de code toegevoegd.

De bedoeling is dus om te zien hoevaak [delimiter] voorkomt.

Kan dit simpeler?

Vroegah had je in VbScript Ubound(myArray). Ik heb dus geen c# variant hiervan kunnen vinden.

[ Voor 20% gewijzigd door TeeDee op 14-12-2004 10:47 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Wat bedoel je met een onbound array? Een array die dynamisch mee kan groeien? Check Arraylist eens.

En mijn gok is dat c# ingebouwde functionaliteit hiervoor heeft. Heb je de string class al bekeken?

[ Voor 35% gewijzigd door Alarmnummer op 14-12-2004 10:56 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:16
@alarmnummer:
De bedoeling is dus om te zien hoevaak [delimiter] voorkomt.
Je split de string op delimiter, dan is het aantal keer dat delimiter voorkomt toch array.length - 1? Beetje nutteloos om dan door de array te gaan loopen denk ik.

[ Voor 24% gewijzigd door sig69 op 14-12-2004 10:58 ]

Roomba E5 te koop


  • The Dutch Dude
  • Registratie: Juli 2002
  • Laatst online: 24-02 11:02

The Dutch Dude

Haiku Rules!

UBound geeft je de upper Bound van de array terug in VB, dus het hoogste aanspreekbare item in de array. Is dat niet zoiets als Array.Count in het .Net framework (VB.Net heeft ook nog UBound beschikbaar)?

[ Voor 33% gewijzigd door The Dutch Dude op 14-12-2004 11:01 ]

Overmatig computergebruik heeft mijn fantasie gedood, dus ben ik niet in staat een interessante tekst hierneer te zetten.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
:?
Je hebt dan idd toch de length prperty?

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
C# kent idd geen UBound, het is ook zeer inefficient want elke keer als de Array Groter moet worden wordt de complete inhoud gekopieerd naar de nieuwe Array. Als je een Array wilt hebben die een dynamische grootte heeft dan moet je gebruik maken van een van de klasses die de System.Collections namespace groot is. ArrayList is idd een goed voorbeeld hiervan, deze gebruikt ook een array maar elke keer als de elementen niet meer in de Array passen wordt de Array meteen een stuk groter gemaakt zodat niet elke keer als er daarna een element toe gevoegd wordt de Array opnieuw vergroot moet worden.

Mischien kan je je probleem ook oplossen met de IndexOf methode. Het lijkt me dat dat sneller is dan je string splitsen, behalve natuurlijk als je je string later alsnog moet splitsen.

[ Voor 14% gewijzigd door Woy op 14-12-2004 11:04 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:30
The Dutch Dude schreef op dinsdag 14 december 2004 @ 10:59:
UBound geeft je de upper Bound van de array terug in VB, dus het hoogste aanspreekbare item in de array.
In VbScript ja. In c# is er dus geen Ubound. En ik kan me haast niet voorstellen dat er geen Ubound variant is.
whoami schreef op dinsdag 14 december 2004 @ 11:01:
:?
Je hebt dan idd toch de length prperty?
Die geeft 9 terug. Geen 3.
3 is in dit geval dus hoevaak delimStr in de de string bericht voorkomt.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Ik heb nog steeds geen idee wat de TS wil maar de code is inefficient. Ik bedoel, de code om split.Length-1 naar num_breaks te kopieren is een goede entry voor de eerste Obfuscuated C# competitie, maar wel O(n) ipv O(1)
Daarnaast is het creeren van deelstrings strings inefficient. Je gebruikt ze helemaal niet?
Tenslotte vermoed ik nog een bug; de operaties op num_breaks zijn ronduit onlogisch.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
TeeDee schreef op dinsdag 14 december 2004 @ 11:02:
[...]

In VbScript ja. In c# is er dus geen Ubound. En ik kan me haast niet voorstellen dat er geen Ubound variant is.
O is dat het. Dat is dan toch gewoon myArray.Length? Ik dacht dat het met een dynamische array te maken had. Maar het hoogst aanspreekbare element in een array is myArray.Length - 1. En als je een ArrayList gebruikt myArrayList.Count - 1 ( Het element met de hoogste index )

[ Voor 6% gewijzigd door Woy op 14-12-2004 11:08 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 18-05 16:28
sig69 schreef op dinsdag 14 december 2004 @ 10:57:
@alarmnummer:
[...]

Je split de string op delimiter, dan is het aantal keer dat delimiter voorkomt toch array.length - 1? Beetje nutteloos om dan door de array te gaan loopen denk ik.
Maar omdat hij op |-| split heeft de array een lengte van 10. Dan zou in jouw geval de delimiter 9 keer voorkomen. Handiger is misschien om de string te splitten op 1 karakter ipv 3.

stp - PSN ID: stp_4


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:30
stp_4 schreef op dinsdag 14 december 2004 @ 11:07:
[...]


Maar omdat hij op |-| split heeft de array een lengte van 10. Dan zou in jouw geval de delimiter 9 keer voorkomen. Handiger is misschien om de string te splitten op 1 karakter ipv 3.
En dat was het dus wat ik probeer te zeggen. (Het topic ging zo snel :))
Omdat ik op een "|-|" 3 karakter split, wat ik helaas niet kan veranderen op dit moment, krijg ik een array.Length van 9 terug. Vandaar de operaties op numb_breaks (MSalters). :)
Maar IndexOf ga ik nog even naar kijken.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Aha, effe gegoogled. TS loopt te knoeien met Split. De documentatie zegt dat Split (char delim[]) splitst op alle karakters in delim. In zijn geval splitst hij dus op '|' en '-'. Vandaar dat hij er ook 9 uit krijgt; dat is precies hoe vaak die twee karakters voorkomen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:16
Die geeft 9 terug. Geen 3.
3 is in dit geval dus hoevaak delimStr in de de string bericht voorkomt.
Dan klopt je array dus niet. Als je op "|-|" split en deze komt 3 keer voor hoort je array 4 groot te zijn, niet 10.

Edit: @MSalters: precies, maar ik dacht ik zeg niet alles voor...

[ Voor 16% gewijzigd door sig69 op 14-12-2004 11:12 ]

Roomba E5 te koop


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

sig69 schreef op dinsdag 14 december 2004 @ 10:57:
@alarmnummer:
[...]
Je split de string op delimiter, dan is het aantal keer dat delimiter voorkomt toch array.length - 1? Beetje nutteloos om dan door de array te gaan loopen denk ik.
Uhhh.... dus als de library eerst alles door gaat lopen... dan ook nog eens objecten gaat aanmaken voor iedere split.. en dan ook nog eens deze objecten op gaat slaan in een array... dat is niet erg? En het eenmalig aflopen van een array zonder onnodig object verbruik is dan ineens wel erg??


Ik doelde verder op de IndexOf functie...

  • Zr40
  • Registratie: Juli 2000
  • Niet online

Zr40

Moderator General Chat

heeft native IPv6

Wat je op dit moment doet is splitten op | en - (de tweede | is genegeerd omdat je daar al op split.), daarom heb je ook 9 items ipv 3. Het beste kan je op een enkel character splitten.

[ Voor 5% gewijzigd door Zr40 op 14-12-2004 11:14 . Reden: http://gathering.tweakers.net/forum/list_message/22351810#22351810 niet gelezen |:( ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
kan je niet gewoon dit doen
C#:
1
2
3
4
5
6
7
int breaks = 0;
int breakIndex = 0;
while( ( breakIndex = myString.IndexOf( "|-|", breakIndex ) ) != -1 )
{
    breaks++;
    breakIndex += "|-|".Length; //Of even een const van de lengte van de string maken natuurlijk
}

Deze code is even uit mijn hoofd getypt dus het kan best foutjes hebben.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 18-05 16:28
Wellicht kun je eerst alle "|" uit je string slopen en daarna op "-" splitten.

edit: is wel crap als "-" als woord-verdeler voorkomt natuurlijk.

[ Voor 40% gewijzigd door stp_4 op 14-12-2004 11:16 ]

stp - PSN ID: stp_4


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:30
stp_4 schreef op dinsdag 14 december 2004 @ 11:15:
Wellicht kun je eerst alle "|" uit je string slopen en daarna op "-" splitten.

edit: is wel crap als "-" als woord-verdeler voorkomt natuurlijk.
En daarom is het dus ook zo'n debiele "delimiter".
Hoevaak komt het voor dat je |-| in een bericht stopt? :)

Maar IndexOf ziet er interessant uit.
@rwb, thanks voor de code, geeft -1 terug, maar ik zal nog naar IndexOf op MSDN kijken.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:16
Tsja, ik weet niet wat |-| in deze context moet betekenen natuurlijk. Misschien dat we daar wat beters voor kunnen bedenken.

offtopic:
Hee STP! :w

[ Voor 21% gewijzigd door sig69 op 14-12-2004 11:28 ]

Roomba E5 te koop


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17:30
sig69 schreef op dinsdag 14 december 2004 @ 11:27:
Tsja, ik weet niet wat |-| in deze context moet betekenen natuurlijk. Misschien dat we daar wat beters voor kunnen bedenken.
Zoals gezegd, kan ik daar op dit moment niets aan veranderen. Dat is ook niet slim, maar goed.

Ik heb het e.e.a. gezocht, geprobeerd e.d.

C#:
1
2
3
4
5
6
7
8
9
string str = myReader["bericht"].ToString();
int num_breaks = 0;
int str_pos = str.IndexOf("|-|");
while(str_pos != -1)
{
   num_breaks++;
   str = str.Substring(str_pos + 1);
   str_pos = str.IndexOf("|-|");
}

Werkt perfect. Lijkt mij minder inefficient dan mijn eerste code.
The Dutch Dude schreef op dinsdag 14 december 2004 @ 10:59:
UBound geeft je de upper Bound van de array terug in VB, dus het hoogste aanspreekbare item in de array. Is dat niet zoiets als Array.Count in het .Net framework (VB.Net heeft ook nog UBound beschikbaar)?
Heel jouw reactie niet gelezen. Daar zal ik ook nog ff induiken. Thanks!

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

TeeDee schreef op dinsdag 14 december 2004 @ 11:35:
[...]

C#:
1
2
3
4
5
6
7
8
9
string str = myReader["bericht"].ToString();
int num_breaks = 0;
int str_pos = str.IndexOf("|-|");
while(str_pos != -1)
{
   num_breaks++;
   str = str.Substring(str_pos + 1);
   str_pos = str.IndexOf("|-|");
}

Werkt perfect. Lijkt mij minder inefficient dan mijn eerste code.
Je moet niet iedere keer die string stukhakken. Je kunt onthouden waar je de vorige keer 1 van jouw zoektermen hebt gevonden.. dan weet je dat je na die positie verder kunt scannen. Check de indexOf methodes.

[ Voor 4% gewijzigd door Alarmnummer op 14-12-2004 11:38 ]


Verwijderd

Je kan ook regular expressions gebruiken om de string te splitsen op "|-|"

C#:
1
2
3
4
5
6
7
8
9
10
using System.Text.RegularExpressions;

string bericht = "";
bericht +="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. |-|";
bericht +="Nulla quis nisl ac nisl molestie vehicula. Sit amet ipsum.|-|";
bericht +="Suspendisse ut mi. Quisque a turpis.|-|";

int num_breaks = 0;
Regex exp = new Regex(Regex.Escape("|-|"));
num_breaks = exp.Matches(bericht).Count;


werkt erg makkelijk zonder allerlei tests en loops enzo.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 14 december 2004 @ 11:53:
Je kan ook regular expressions gebruiken om de string te splitsen op "|-|"

C#:
1
2
3
4
5
6
7
8
9
10
using System.Text.RegularExpressions;

string bericht = "";
bericht +="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. |-|";
bericht +="Nulla quis nisl ac nisl molestie vehicula. Sit amet ipsum.|-|";
bericht +="Suspendisse ut mi. Quisque a turpis.|-|";

int num_breaks = 0;
Regex exp = new Regex(Regex.Escape("|-|"));
num_breaks = exp.Matches(bericht).Count;


werkt erg makkelijk zonder allerlei tests en loops enzo.
Is natuurlijk ook een optie. Het zal waarschijnlijk alleen wel langzamer zijn als de methode met een loopje. Maar ik betwijfel of dat in dit geval echt veel uit zal maken ( Ligt er natuurlijk aan hoe vaak dit moet gebeuren. )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
De snelheid van de RegExp wordt voornamelijk beperkt door de "new Regex( )"; de "exp.Matches(bericht)" gaat behoorlijk snel (match tegen fixed pattern). De kunst is dus om die Regex te bewaren.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MSalters schreef op dinsdag 14 december 2004 @ 13:28:
De snelheid van de RegExp wordt voornamelijk beperkt door de "new Regex( )"; de "exp.Matches(bericht)" gaat behoorlijk snel (match tegen fixed pattern). De kunst is dus om die Regex te bewaren.
Het zal idd wel redelijk snel zijn, maar ik denk toch dat het met een loopje toch sneller kan aangezien die regex toch ook door je string moet wandelen om te kunnen matchen. Als IndexOf dan een beetje optimaal geimplementeerd is dan lijkt me dat toch echt de snelste manier. Maar nogmaals: als je het maar een keer in je programma doet haalt die kleine winst natuurlijk niks uit.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Bij een normaal array heb je in C# gewoon de functies GetLowerBound() en GetUpperBound() :)

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


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

MSalters schreef op dinsdag 14 december 2004 @ 13:28:
De snelheid van de RegExp wordt voornamelijk beperkt door de "new Regex( )"; de "exp.Matches(bericht)" gaat behoorlijk snel (match tegen fixed pattern). De kunst is dus om die Regex te bewaren.
Als de Regex voor grote lappen tekst gebruikt wordt kun je beter dit doen:

C#:
1
Regex exp = new Regex(Regex.Escape("|-|"), RegexOptions.Compiled);


Daardoor wordt de hele regex gecompiled naar een assembly. Het aanmaken duurt iets langer (maar niet veel, aangezien het een hele kleine regex is) en het uitvoeren gaat als een tiet.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?

Pagina: 1