[VB.NET/VS]bug in Array.Sort(strings)? Console window in VS?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
Over Array.Sort(strings), neem onderstaand voorbeeld:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Module Module1

    Sub Main()
        Dim arrStr() As String = {"B", "b"}
        Array.Sort(arrStr)
        Debug.Print(arrStr(0))
        Debug.Print(StrComp("b", "B"))

        Console.Write("some console output")

        Stop
    End Sub

End Module


Verwachte debug output:
B
1

Reële debug output:
b
1

Aangezien B voor b komt, leid ik hieruit af dat StrComp correct is en dat Array.Sort niet correct werkt voor String arrays. M.a.w. een bug in VB.NET. Of zie ik iets over het hoofd :?

Over Console window:
Hoe zorg je ervoor dat het Console window gewoon blijft staan als het programma ten einde is?
Zijn al afgekeurd:
1) Ctrl+F5
dit geeft geen Debug output
2) iets als Console.ReadKey() of Stop op het einde van je programma
het kan toch niet dat je code in je programma moet zetten om ervoor te zorgen dat je IDE doet wat je wil?

Als laatste: waar vind ik het "Console window" zoals hier uitgelegd? Als ik een console applicatie uitvoer wil ik geen apart venster, maar gewoon een gedockt venster in VS, & volgens die post is dat dus mogelijk in VS 2005, maar ik kan het nergens terugvinden in VS 2008.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Waarom compare je strings zo?

Strings moet je vergelijken met
Visual Basic .NET:
1
"b".Equals("B", StringComparison.InvariantCultureIgnoreCase)


Niet met een of andere legacy VB functie

[ Voor 11% gewijzigd door Snake op 02-04-2010 17:01 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

terje7601 schreef op vrijdag 02 april 2010 @ 16:47:
2) iets als Console.ReadKey() of Stop op het einde van je programma
het kan toch niet dat je code in je programma moet zetten om ervoor te zorgen dat je IDE doet wat je wil?
Waarom niet? Een console is iets heel anders dan een "standaard" Windowsprogramma. Als het afgelopen is, dan is het afgelopen en sluit het. Als je dat niet wil, dan zul je het programma bezig moeten houden met een ReadKey-aanroep.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Jij gaat er vanuit dat Array.Sort de functie StrComp gebruikt om te sorteren, maar dat is helemaal niet zo. Een programmaatje om dat te bewijzen (C# maar dat maakt niet uit, de functie is hetzelfde):

C#:
1
2
3
4
5
6
7
var strings = new[] { "B", "b" };

Array.Sort(strings);
Console.WriteLine(strings[0]);
Console.WriteLine(strings[1]);

Console.WriteLine("b".CompareTo("B"));


Array.Sort gebruikt intern IComparable<string>.CompareTo(), wat ik op regel 7 ook doe.

De output van dit stukje code is als volgt:

code:
1
2
3
b
B
-1


Jij hebt Option Compare Binary (impliciet of expliciet) gedefinieerd, waardoor StrComp binair gaat sorteren (en B dus vóór b komt). Meestal wil je dat niet, en het standaard gedrag van Array.Sort met een string-array is dus ook tekstueel sorteren.

En btw:
1) Ctrl+F5
dit geeft geen Debug output
No shit, sherlock. Dat heet dan ook 'Start without Debugging'. Als je een console-applicatie draait, is het meestal handig dat die applicatie ook output geeft op de console. Console.WriteLine dus, ipv Debug.WriteLine.

[ Voor 15% gewijzigd door Korben op 02-04-2010 17:03 ]

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


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Korben schreef op vrijdag 02 april 2010 @ 17:01:
Jij gaat er vanuit dat Array.Sort de functie StrComp gebruikt om te sorteren, maar dat is helemaal niet zo. Een programmaatje om dat te bewijzen (C# maar dat maakt niet uit, de functie is hetzelfde):

C#:
1
2
3
4
5
6
7
var strings = new[] { "B", "b" };

Array.Sort(strings);
Console.WriteLine(strings[0]);
Console.WriteLine(strings[1]);

Console.WriteLine("b".CompareTo("B"));


Array.Sort gebruikt intern IComparable<string>.CompareTo(), wat ik op regel 7 ook doe.

De output van dit stukje code is als volgt:

code:
1
2
3
b
B
-1


Jij hebt Option Compare Binary (impliciet of expliciet) gedefinieerd, waardoor StrComp binair gaat sorteren (en B dus vóór b komt). Meestal wil je dat niet, en het standaard gedrag van Array.Sort met een string-array is dus ook tekstueel sorteren.
Wat ook gewoon in de MSDN staat: http://msdn.microsoft.com/en-us/library/6tf1f0bc.aspx

Daarom kan je beter C# gebruiken, die is daar een stuk strikter in, geen Option Explicit Off, geen Option Strict Off, geen Option Compare Text...

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Snake schreef op vrijdag 02 april 2010 @ 17:04:
[...]

Wat ook gewoon in de MSDN staat: http://msdn.microsoft.com/en-us/library/6tf1f0bc.aspx

Daarom kan je beter C# gebruiken, die is daar een stuk strikter in, geen Option Explicit Off, geen Option Strict Off, geen Option Compare Text...
Mwoh, je kunt ook bij StrComp gewoon een CompareMethod opgeven. Dan maakt het niet uit of je Option Compare Binary of wat dan ook hebt gedefinieerd. Maar ja, dan moet je er wel aan denken om die CompareMethod mee te geven. :z

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


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Korben schreef op vrijdag 02 april 2010 @ 17:08:
[...]

Mwoh, je kunt ook bij StrComp gewoon een CompareMethod opgeven. Dan maakt het niet uit of je Option Compare Binary of wat dan ook hebt gedefinieerd. Maar ja, dan moet je er wel aan denken om die CompareMethod mee te geven. :z
Ach ik moet gewoon niets hebben van die Microsoft.VisualBasic namespace. Vol met legacy stuff.

vbNullString... Ipv gewoon null (Nothing) te schrijven...

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Snake schreef op vrijdag 02 april 2010 @ 17:17:
[...]

Ach ik moet gewoon niets hebben van die Microsoft.VisualBasic namespace. Vol met legacy stuff.

vbNullString... Ipv gewoon null (Nothing) te schrijven...
offtopic:
Aan de andere kant, sommige dingen kun je sneller uit de VisualBasic namespace halen dan het zelf te moeten schrijven. Zoals de totale hoeveelheid aanwezig geheugen.

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


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Snake schreef op vrijdag 02 april 2010 @ 17:17:
[...]

Ach ik moet gewoon niets hebben van die Microsoft.VisualBasic namespace. Vol met legacy stuff.
offtopic:
Agreed; hoewel ik ooit wel eens de TextFieldParser gebruikt heb; die was wel handig :P

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!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
terje7601 schreef op vrijdag 02 april 2010 @ 16:47:
Over Console window:
Hoe zorg je ervoor dat het Console window gewoon blijft staan als het programma ten einde is?
Zijn al afgekeurd:
1) Ctrl+F5
dit geeft geen Debug output
2) iets als Console.ReadKey() of Stop op het einde van je programma
het kan toch niet dat je code in je programma moet zetten om ervoor te zorgen dat je IDE doet wat je wil?
Je kunt toch gewoon een breakpoint op de laatste regel zetten? Bij ctrl-f5 kan dat niet, dus is het handig dat vs daar een pause na afloop doet. Bij f5 wil je vaak ook je variabelen kunnen bekijken, dus zet je gewoon een breakpoint lijkt me... :p
Als laatste: waar vind ik het "Console window" zoals hier uitgelegd? Als ik een console applicatie uitvoer wil ik geen apart venster, maar gewoon een gedockt venster in VS, & volgens die post is dat dus mogelijk in VS 2005, maar ik kan het nergens terugvinden in VS 2008.
Die vraag heeft dacht ik niet echt een antwoord, maar persoonlijk zit ik daar ook niet op te wachten. Gekke blogpost. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
Kort samengevat: ik wil graag dat de console in VS op dezelfde manier werkt als het "Console" view in Eclipse, met als belangrijkste punten:
1) docken van de console in VS zelf (i.e. het wordt een "native" venster zoals Toolbox, Properties etc.)
2) output (& input) blijft beschikbaar, ook nadat het programma afgelopen is

Maar uit de antwoorden leid ik af dat dat ijdele hoop is :)
Korben schreef op vrijdag 02 april 2010 @ 17:01:
Jij hebt Option Compare Binary (impliciet of expliciet) gedefinieerd, waardoor StrComp binair gaat sorteren (en B dus vóór b komt). Meestal wil je dat niet, en het standaard gedrag van Array.Sort met een string-array is dus ook tekstueel sorteren.
Inderdaad, maar met Option Compare op Text returnt
Visual Basic .NET:
1
StrComp("b", "B")
0, dus het is simpelweg niet mogelijk om StrComp consistent te maken & -1 te laten returnen?
Niet dat het nog veel belang heeft, want als ik het goed begrepen heb is Microsoft.VisualBasic zo 'n beetje een kerkhof van legacy functies. Nu vraag ik me wel af: wat is dan legacy & wat niet? Zijn deze constanten dan ook legacy? Het lijkt me van niet, want voor zover ik kan zien zijn dingen als \t of \r\n "C# only"?
Voor vbNewLine (= vbCrLf), zou je nog System.Environment.NewLine kunnen gebruiken, maar zijn er ook alternatieven voor vbTab, vbBack...?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 08:42

Haan

dotnetter

Korben schreef op vrijdag 02 april 2010 @ 17:23:
[...]

offtopic:
Aan de andere kant, sommige dingen kun je sneller uit de VisualBasic namespace halen dan het zelf te moeten schrijven. Zoals de totale hoeveelheid aanwezig geheugen.
offtopic:
MSDN site is onlangs vernieuwd? Ziet er weer fris uit.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
terje7601 schreef op vrijdag 02 april 2010 @ 19:43:
Kort samengevat: ik wil graag dat de console in VS op dezelfde manier werkt als het "Console" view in Eclipse, met als belangrijkste punten:
1) docken van de console in VS zelf (i.e. het wordt een "native" venster zoals Toolbox, Properties etc.)
2) output (& input) blijft beschikbaar, ook nadat het programma afgelopen is

Maar uit de antwoorden leid ik af dat dat ijdele hoop is :)
Ik vermoed dat wat jij wil Debug.WriteLine() is. De console in .net is fundamenteel anders dan in java, omdat de .net-variant echte console-applicaties mogelijk maakt. Denk aan dingen als Console.Clear() en Console.SetWindow..., en een echte Console.ReadKey(true).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
pedorus schreef op vrijdag 02 april 2010 @ 19:56:
[...]

Ik vermoed dat wat jij wil Debug.WriteLine() is. De console in .net is fundamenteel anders dan in java, omdat de .net-variant echte console-applicaties mogelijk maakt. Denk aan dingen als Console.Clear() en Console.SetWindow..., en een echte Console.ReadKey(true).
Inderdaad, ik begin het te snappen. Bedankt :)
terje7601 schreef op vrijdag 02 april 2010 @ 19:43:
Nu vraag ik me wel af: wat is dan legacy & wat niet?
Waarom wordt bijv. niet alles in Microsoft.VisualBasic zo agressief mogelijk als Obsolete gemarkeerd?

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Heel simpel: Microsoft.VisualBasic is er voor VB developers die .NET apps gaan doen. Niet meer en niet minder. Eigelijk zou die namespace standaard niet meer geimporteerd mogen worden...

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
Snake schreef op vrijdag 02 april 2010 @ 20:45:
Heel simpel: Microsoft.VisualBasic is er voor VB developers die .NET apps gaan doen. Niet meer en niet minder. Eigelijk zou die namespace standaard niet meer geimporteerd mogen worden...
Precies wat ik nodig had :) Ik heb Microsoft.VisualBasic uitgeschakeld & enkel Microsoft.VisualBasic.Constants (voor vbTab e.d.) toegevoegd als te importeren namespace.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

terje7601 schreef op vrijdag 02 april 2010 @ 22:15:
[...]


Precies wat ik nodig had :) Ik heb Microsoft.VisualBasic uitgeschakeld & enkel Microsoft.VisualBasic.Constants (voor vbTab e.d.) toegevoegd als te importeren namespace.
Visual Basic .NET:
1
2
public const string vbTab = "\t";
 

Je code is net wat professioneler geworden ;)

Moet je geintereseerd zijn in de implementatie van de Microsoft.VisuaBasic namespace: je kan altijd met reflector kijken in deze dll: C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.VisualBasic.dll

[ Voor 20% gewijzigd door Snake op 03-04-2010 09:51 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
Snake schreef op zaterdag 03 april 2010 @ 09:49:
[...]

Visual Basic .NET:
1
2
public const string vbTab = "\t";
 

Je code is net wat professioneler geworden ;)

Moet je geintereseerd zijn in de implementatie van de Microsoft.VisuaBasic namespace: je kan altijd met reflector kijken in deze dll: C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.VisualBasic.dll
Bedankt voor de Reflector tip :) Maar is die code niet C#? Hier krijg ik
Visual Basic .NET:
1
Public Const vbTab As String = ChrW(9)

En ook uit het verschil tussen de character literals in C# en die in Visual Basic, leid ik af dat er geen beter alternatief is voor vbTab?

Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
terje7601 schreef op zaterdag 03 april 2010 @ 10:46:
[...]


Bedankt voor de Reflector tip :) Maar is die code niet C#? Hier krijg ik
Visual Basic .NET:
1
Public Const vbTab As String = ChrW(9)

En ook uit het verschil tussen de character literals in C# en die in Visual Basic, leid ik af dat er geen beter alternatief is voor vbTab?
Hij bedoelt dat je die constante in een class weg moet stoppen in je C# project zodat je dat niet meer uit de VB.NET namespace hoeft te halen. :)

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
l0c4lh0st schreef op zaterdag 03 april 2010 @ 17:07:
[...]

Hij bedoelt dat je die constante in een class weg moet stoppen in je C# project zodat je dat niet meer uit de VB.NET namespace hoeft te halen. :)
Hm..maar ik heb helemaal geen C# project (ben gewoon wat VB.NET aan het leren) :) En mocht het wel C# zijn, dan zou ik toch gewoon \t kunnen gebruiken? Misschien snap ik je antwoord niet, maar ik vraag me gewoon af of er een beter alternatief is dan vbTab in VB.NET (en \t wordt in VB.NET niet geïnterpreteerd als een escape sequence voor tab, dus dat kan geen alternatief zijn, toch?).

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Netjes is denk ik ControlChars.Tab; dat is ook daadwerkelijk een Char ipv een String. :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

terje7601 schreef op zaterdag 03 april 2010 @ 18:07:
[...]


Hm..maar ik heb helemaal geen C# project (ben gewoon wat VB.NET aan het leren) :) En mocht het wel C# zijn, dan zou ik toch gewoon \t kunnen gebruiken? Misschien snap ik je antwoord niet, maar ik vraag me gewoon af of er een beter alternatief is dan vbTab in VB.NET (en \t wordt in VB.NET niet geïnterpreteerd als een escape sequence voor tab, dus dat kan geen alternatief zijn, toch?).
Ik heb geen VB.NET geinstalleerd, maar daar heb je wel een punt hoor. Character escaping werkt niet het zelfde in C# als in VB.NET, je moet dus Chrw(9) gebruiken.
pedorus schreef op zaterdag 03 april 2010 @ 20:32:
Netjes is denk ik ControlChars.Tab; dat is ook daadwerkelijk een Char ipv een String. :)
Dat zit ook in die Namespace. Misschien is het gewoon beter om C# te gebruiken? :P

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
pedorus schreef op zaterdag 03 april 2010 @ 20:32:
Netjes is denk ik ControlChars.Tab; dat is ook daadwerkelijk een Char ipv een String. :)
Ziet er inderdaad netjes uit, dat wordt 'm :)
Snake schreef op zondag 04 april 2010 @ 12:57:
[...]

Dat zit ook in die Namespace. Misschien is het gewoon beter om C# te gebruiken? :P
Ik wil eerst een simpel VB.NET programma (à la Mijnenveger) schrijven, maar ben inderdaad van plan om dan zo snel mogelijk naar C# over te gaan ;)

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

C# is zeker zo simpel als VB.NET. Er zijn maar 1 language feature in VB.NET die ik benijd als C# developer, namelijk 'RaiseEvent'

Maar de declaratie van variablen die events kunnen raisen, dat die WithEvents moeten zijn in VB.NET, dat is idioot.

Maar in VB.NET kan je dit doen:

Visual Basic .NET:
1
RaiseEvent SomeEvent("this", "that")


Terwijl in C# je dit moet doen:
C#:
1
2
3
4
if(null != SomeEvent)
{
   SomeEvent("this", "that");
}

Wat eigelijk gek is dat ze de RaiseEvent feature van IL niet exposen in C#.
Wat wel gaat in de declaratie van je event in C# is dit:
C#:
1
public event SomeEventHandler SomeEvent = delegate {};
Dan moet je niet meer checken of dat ie null is, want dan heeft hij al een default value :)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Je kunt aan een event een lege delegate hangen en dan kun je vanaf dat moment altijd gewoon SomeEvent() doen, niet de mooiste oplossing, maar wel acceptabel.

Daar was je zelf ook al achter :).

(Ik snap trouwens niet waarom je zelf altijd moet checken of SomeEvent != null, je verwacht toch dat SomeEvent een soort van lijst van listeners is, met een leuk loopje die gewoon niet uitgevoerd wordt als nItems < 1, maar het zal wel iets met optimalisaties te maken hebben, dat er uberhaupt nog niets is totdat er iets aan gehangen wordt.)

[ Voor 4% gewijzigd door roy-t op 05-04-2010 13:04 ]

~ Mijn prog blog!

Pagina: 1