Avatar billede jpeace Nybegynder
08. februar 2010 - 15:03 Der er 8 kommentarer og
1 løsning

Override equals - Collection

Hej,

Jeg har brug for at lave min egen Equals implementation, da jeg skal sammenligne 2 strukturer, som indeholder en Collection<MyType>.

ReSharper kan autogenere en Equals, men den kan ikke bruges ved en collection. Derfor har jeg implemeneteret en funktion der sammenligner hvert enkelt objekt i en foreach, se nedenfor.
Denne metode kaldes fra Equals() - i stedet for Equals(other.MyType, MyType), da den ikke kan bruges ved en collection. Her er other.MyType og MyType - to collections.

private static bool MyTypeEquals(Collection<MyType> other,
Collection<MyType> mine)
{
if(mine.Count != other.Count)
return false;

foreach (MyType myType in mine)
{
if(!other.Contains(myType))
    return false;
}
return true;
}

Det virker, men jeg kunne forestille mig at der kunne være en mere effektiv måde at gøre det på?

Eksemplet er ikke helt komplet, men jeg håber at det fremgår hvad problemstillingen er. Ellers må jeg lige få konstrueret et bedre eksempel.

Pft.
Avatar billede arne_v Ekspert
08. februar 2010 - 15:11 #1
Naeppe.

Din foreach er en O(n) og din Contains vil for de fleste collections vaere en O(n) hvilket vil give en samlet O(n^2) kompleksitet.

Og det er ligesom det som problem stillingen definerer.

Hvis du skal have noget hurtigere skal du enten bruge sorterede lister eller other skal vaere et dictionary.
Avatar billede bitmatic Nybegynder
08. februar 2010 - 15:53 #2
Jeg er ikke sikker på, at din metode er valid.

En collection kan (så vidt jeg husker) indeholde samme objekt flere gange, og så render du ind i problemer.

Hvis du har to collections af int's for eksempel, der ser sådan her ud:
{1,3,3,4}
{1,1,3,4}

Så vil din implementation af equals påstå at de er ens...
Avatar billede arne_v Ekspert
09. februar 2010 - 02:02 #3
Hvis en collection er en System.Collections.Generic.ICollection som jeg antog, så vil de fleste af implementationerne tillade duplikater.

Hvorvidt rækkefølge og antal forekomster af værdier er signifikante er et spørgsmål om hvad det skal bruges til.
Avatar billede jpeace Nybegynder
12. februar 2010 - 10:24 #4
Takker for svarene!

Det er denne Collection jeg bruger:
Member of System.Collections.ObjectModel (Collection<T>). Som er en generic collection.
Jeg er dog ikke helt klar over forskellen til System.Collections.Generic.ICollection.

Jeg mangler at afklare om det vil være nødvendigt at undersøge om situationen som bitmatic viser er aktuel i dette tilfælde.
Avatar billede arne_v Ekspert
14. februar 2010 - 03:31 #5
System.Collections.ObjectModel.Collection<T> implementerer System.Collections.Generic.ICollection<T>
Avatar billede arne_v Ekspert
01. marts 2010 - 01:06 #6
kommet videre?
Avatar billede jpeace Nybegynder
25. april 2010 - 22:52 #7
Jeg takker for begge jeres input. Jeg fik det nogenlunde på plads... så jeg må hellere få lukket og afgivet points.
Jeg kunne bruge input fra jer begge to, så jeg deler pointsne mellem Jer.
Smider I et svar?
Avatar billede arne_v Ekspert
25. april 2010 - 22:59 #8
svar fra mig
Avatar billede jpeace Nybegynder
08. maj 2010 - 21:41 #9
jeg giver alle points til arne_v, da bitmatic ikke har afgivet et svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester