Gå til innhold

C#: Skal samanlikning av int'er skje med == eller Equals()?


Anbefalte innlegg

Videoannonse
Annonse

Int og de andre basistypene, inkludert string, overlaster operator ==. Dermed kan du trygt bruke == til å sammenligne stringer og inter i c#.

 

Dette er ulikt Java der == på basistyper tester verdi-likhet, mens == på objekter tester referanse-likhet. Dermed må man bruke String.equals() i Java.

Lenke til kommentar
Geir: du har aldri brukt Equals på stringer, men jeg regner med du har brukt den på andre typer? :)

 

Nei, ikke det jeg kan huske ihvertfall.

Må bare tenke meg litt om...

 

Det har egentlig aldri vært aktuelt, jeg sammenligner heller aldri stringer for den saks skyld, hverken med == eller .Equals

 

For meg har det oftere vært fornuftig å sammenligne objekter etter referanse, og ikke etter verdi, stringer lager jeg ofte hash verdier av istedet for å sammenligne innholdet.

Lenke til kommentar
Geir: du har aldri brukt Equals på stringer, men jeg regner med du har brukt den på andre typer? :)

 

Nei, ikke det jeg kan huske ihvertfall.

Må bare tenke meg litt om...

 

Det har egentlig aldri vært aktuelt, jeg sammenligner heller aldri stringer for den saks skyld, hverken med == eller .Equals

 

For meg har det oftere vært fornuftig å sammenligne objekter etter referanse, og ikke etter verdi, stringer lager jeg ofte hash verdier av istedet for å sammenligne innholdet.

 

Hvorfor lager du HASH verdier av strenger?

 

Mulig jeg er gammeldags her men

if(SomeString == "Heisan")

eller

switch(SomeString)
{
 case "Hei":
break;
 case "på":
break;
 case "Deg":
break;
}

er da helt vanlige måter å sjekke strenger på? eller?

Eller hva med

if(SomeString.SubString(0,3) == "NOE")

 

Eller har jeg missforstått emnet?

Lenke til kommentar
For noe tøv. Skal man kun sjekke string-likhet bruker man ikke String.Compare. Skal man sjekke leksikografisk rekkefølge derimot.

NATURLIGVIS bruker man string.Compare. Da kan man på ryddig vis sammenligne med eller uten store bokstaver (i tillegg til leksikografisk - som jeg veldig sjelden bryr meg om)

string.Compare(noe, "noe", true) == 0 for "NOE" "noe" og alle varianter i mellom. Mye ryddigere enn noe.ToLower()=="NOE" - som sikkert lager midlertidige objekter, i tillegg til å være opplagt feil.

 

- grå -

Lenke til kommentar

public class Texture
{
 protected int m_hash;
 public override int GetHashCode()
 {
return m_hash;
 }

 public Texture(Bitmap src)
 {
LoadBitmap(src);
m_hash = -1;  
 }
 public Texture(string filename)
 {
LoadBitmap(Bitmap.FromFile(filename));
m_hash = TextureCollection.CreateHashFromFilename(filename);
 }
}

public class TextureCollection
{
 public static int CreateHashFromFilename(string text)
 {
MD5 md5 = MD5.Create();
return BitConverter.ToInt32(md5.CreateHash(Encoding.Unicode.GetBytes(filename.ToLower())));
 }
 protected List<Texture> m_textures
 public Texture LoadTexture(string filename)
 {
int hash = CreateHashFromFilename(filename);
Texture res = m_textures.Find(delegate (Texture tex) { return tex.GetHashCode() == hash; });
if(res == null)
{
  res = new Texture(filename);
  m_textures.Add(res);
}
return res;
 }
}

 

Ved siden av være mer effektiv i lengden, kan også hash verdier gjøre slik at en kan f.eks. lagre en hash verdi i en fil, uten å referere til en spesiell fil i dette tilfellet.

 

Jeg synes ihvertfall det ofte er en god idé.

Lenke til kommentar
For noe tøv. Skal man kun sjekke string-likhet bruker man ikke String.Compare. Skal man sjekke leksikografisk rekkefølge derimot.

NATURLIGVIS bruker man string.Compare. Da kan man på ryddig vis sammenligne med eller uten store bokstaver (i tillegg til leksikografisk - som jeg veldig sjelden bryr meg om)

string.Compare(noe, "noe", true) == 0 for "NOE" "noe" og alle varianter i mellom. Mye ryddigere enn noe.ToLower()=="NOE" - som sikkert lager midlertidige objekter, i tillegg til å være opplagt feil.

 

- grå -

 

if(tehstring.Equals("noe", StringComparison.CurrentCultureIgnoreCase))

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...