[c#] identieke strings toch verschillend?

Pagina: 1
Acties:
  • 391 views sinds 30-01-2008
  • Reageer

  • Magic
  • Registratie: September 2001
  • Niet online
Ik heb hier 2 strings met ogenschijnlijk dezelfde inhoud, maar als ik ze wil vergelijken, dan zegt c# dat ze toch niet identiek zijn.

de ene string word uit een database gehaald met de volgende code:
C#:
1
blaat2 = dataSet11.gebruikers.FindBygebruikersnaam(para1string).wachtwoord;


en de 2e word omgezet vanuit een chararray:
C#:
1
2
string para1string;
para1string = new string (parameter1)


als ik deze ga vergelijken dmv een if-statement, dan springt hij elke keer door naar het else gedeelte. als ik ze echter eerst in 2 textBoxjes zet, en deze met elkaar ga vergelijken, dan zegt c# dat de waarde van de editBoxjes wel gelijk zijn.

we hebben met trim al geprobeert om overbodige tekens uit de string te halen, en dit werkt ook niet. inmiddels hebben we het al opgelost dmv System.String.Compare, deze werkt wel goed, we zijn alleen heel nieuwschierig waar het nou precies aan ligt.

Steam: Brainfrz82 | PSN: Brainfrz | Discord: Brainfrz


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Imo vergelijk je de geheugenlocatie ipv de inhoud.

Ken C# niet, maar zo kan dat in java per ongeluk gebeuren als je
if (stringEen==stringTwee) bla;
doet

{signature}


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
String.Compare is 'culture-aware', misschien heeft het daar iets mee te maken.
't Hangt natuurlijk af van wat die strings die jij vergelijkt bevatten of het daar iets mee te maken heeft.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Voutloos schreef op 06 October 2003 @ 16:08:
Imo vergelijk je de geheugenlocatie ipv de inhoud.

Ken C# niet, maar zo kan dat in java per ongeluk gebeuren als je
if (stringEen==stringTwee) bla;
doet
De == operator vergelijkt de inhoud van de strings. Die operator is geimplementeerd mbhv de Equals method van de string class. Die method is ook case-sensitive.
Bij de Compare method kan je opgeven of je case sensitive of case insensitive wilt vergelijken.

https://fgheysels.github.io/


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De == operator vergelijkt de inhoud van de strings.
Ok, dan is C# anders wat dat betreft. Kon het proberen.

{signature}


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op 06 October 2003 @ 16:12:
[...]


De == operator vergelijkt de inhoud van de strings. Die operator is geimplementeerd mbhv de Equals method van de string class. Die method is ook case-sensitive.
Bij de Compare method kan je opgeven of je case sensitive of case insensitive wilt vergelijken.
In de docs lees ik anders
This operator is implemented using the Equals method, which means the comparands are tested for a combination of reference and value equality. The comparison is case-sensitive.
Waaruit ik concludeer dat ook de reference gechecked wordt.

Echter is de Equals methode natuurlijk wel alleen voor value dus het is wel een beetje vreemd. Uit de docs van Equals
Determines whether this instance and a specified String have the same value.

[ Voor 16% gewijzigd door Woy op 06-10-2003 17:17 ]

“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.”


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

whoami schreef op 06 October 2003 @ 16:12:
[...]


De == operator vergelijkt de inhoud van de strings. Die operator is geimplementeerd mbhv de Equals method van de string class. Die method is ook case-sensitive.
Bij de Compare method kan je opgeven of je case sensitive of case insensitive wilt vergelijken.
Dit is op zich natuurlijk juist, maar strings bekleden hier een uitzonderingspositie: C# beschouwt voor == normaliter wel degelijk identity (zelfde object) en niet equality (zelfde waarde). Beschouw een class Persoon
C#:
1
2
3
4
5
6
7
8
9
public class Persoon
{
    private string naam;

    public Persoon (string n)
    { 
        naam = n;
    }
}

Als je dan het volgende probeert krijg je 'false' als output:
C#:
1
2
3
4
p1 = new Persoon("whoami");
p2 = new Persoon("whoami");

Console.WriteLine(p1 == p2);
Het probleem van de ts ligt dus toch wel ergens in de typedefinitie van de twee vergeleken ?strings?, denk ik. Als je - heel dom :) - achter beide leden van de vergelijking .ToString() zet, denk ik dat 'ie het wel goed doet.

Maar zoals gezegd, de vergelijkingsoperators zijn overloaded voor de string en zouden waarden moeten vergelijken. Vreemd.
edit:
*zwaait naar rwb :w*

[ Voor 6% gewijzigd door Rataplan op 06-10-2003 17:24 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 14-08 11:19

dotcode

///\00/\\

Bij string is de == overload zodat hij de inhoud vergelijkt. Dit kan je ook doen in persoon. Maar hier vergelijk jij de twee objecten persoon met elkaar vergelijken en die zijn natuurlijk niet het zelfde.

if (p.ToSting() == p.ToString()) // nu "Persoon" == "Persoon"

zal altijd waar zijn. Je moet nog de methode ToString overschrijven met zo iets:

public override string ToString(){
return naam;
}

Nou misschien nog even wat docu lezen ??

[ Voor 12% gewijzigd door dotcode op 06-10-2003 18:07 ]


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

dotcode schreef op 06 October 2003 @ 17:50:
Bij string is de == overload zodat hij de inhoud vergelijkt. Dit kan je ook doen in persoon. Maar hier vergelijk jij de twee objecten persoon met elkaar vergelijken en die zijn natuurlijk niet het zelfde.
Dat is inderdaad het punt dat ik maak; ik illustreer dat "==" niet voor elk objecttype hetzelfde functioneert. Ook denk ik dat de poster misschien twee objecten vergelijkt, en niet twee strings. Maar dat had ik hierboven al gezegd.
Nou misschien nog even wat docu lezen ??
Misschien mijn post nog een keertje lezen?


Journalism is printing what someone else does not want printed; everything else is public relations.


  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 14-08 11:19

dotcode

///\00/\\

als je achter beide personen ToString zet doet hij het dus niet!

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

dotcode schreef op 06 oktober 2003 @ 18:04:
als je achter beide personen ToString zet doet hij het dus niet!
Even voor de duidelijkheid: een ts is een topicstarter. Ik schrijf
Rataplan schreef op 06 oktober 2003 @ 17:21:
Het probleem van de ts ligt dus toch wel ergens in de typedefinitie van de twee vergeleken ?strings?, denk ik. Als je - heel dom :) - achter beide leden van de vergelijking .ToString() zet, denk ik dat 'ie het wel goed doet.
en de vergelijking waar ik het over heb is dus de vergelijking van de topicstarter; en niet de vergelijking uit mijn voorbeeld.

Duidelijk?

edit:
C#:
1
Console.WriteLine(p1.ToString() == p2.ToString());
werkt bij mij trouwens prima. Alleen vergelijk je dan het type <namespace>.Persoon met het type <namespace>.Persoon, wat altijd true oplevert, dus dat zou totaal onzinnig zijn.

[ Voor 17% gewijzigd door Rataplan op 06-10-2003 18:19 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
String s1;
String s2;
            
s1 = "whoami";
s2 = "whoami";
            
if( s1 == s2 )
{
    Console.WriteLine ("gelijk");
}
else
{
    Console.WriteLine ("niet gelijk");
}
            
string str1, str2;
str1 = "whoami";
str2 = "whoami";
if( str1 == str2 )
{
   Console.WriteLine("gelijk");
}
else
{
   Console.WriteLine("niet gelijk");
}
            
if( s1 == str1 )
{
    Console.WriteLine("gelijk");
}
            
Console.ReadLine();


Dit code-voorbeeld heeft als output:
gelijk
gelijk
gelijk

https://fgheysels.github.io/


  • Magic
  • Registratie: September 2001
  • Niet online
achter beide .ToString() zetten heb ik al geprobeert, en het haalt niks uit. het is alleen zo dat als ik
C#:
1
if (para1string == "waarde")

gebruik, dan gaat hij naar het else gedeelte, maar bij
C#:
1
if (blaat1 == "waarde")

dan werkt hij wel gewoon, het lijkt me dus te liggen aan het omzetten van de chararray naar een string, aangezien uit de database halen wel gewoon werkt.

[ Voor 11% gewijzigd door Magic op 06-10-2003 18:20 ]

Steam: Brainfrz82 | PSN: Brainfrz | Discord: Brainfrz


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Magic schreef op 06 October 2003 @ 18:18:
achter beide .ToString() zetten heb ik al geprobeert, en het haalt niks uit. het is alleen zo dat als ik
C#:
1
if (para1string == "waarde")

gebruik, dan gaat hij naar het else gedeelte, maar bij
C#:
1
if (blaat1 == "waarde")

dan werkt hij wel gewoon, het lijkt me dus te liggen aan het omzetten van de chararray naar een string, aangezien uit de database halen wel gewoon werkt.
Het lijkt me dan dat je misschien met een UTF/Unicode probleem zit? Kijk hier eens voor het exacte type dat je aan de constructor voert... (edit) en laat ons dat type ook even weten, dat klept wat makkelijker ;)

@whoami: ja? Daar is iedereen het toch over eens?

[ Voor 9% gewijzigd door Rataplan op 06-10-2003 18:31 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Wat zit er dan bv in die string?
Zijn beide strings ook gelijk qua casing? Bevatten ze regional-specific settings oid?

https://fgheysels.github.io/

Pagina: 1