[C#]IComparer implementatie probleem

Pagina: 1
Acties:

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Hallo,

Ik probeer een arraylist met Uri objecten te sorteren.
Daarvoor moet ik een custom comparer maken.

Nu het ik de class UriComparer gemaakt die de interface IComparer implementeerd.

Het gekke is dat als ik de boel probeer te compilen dat de compiler zegt dat mijn class de Compare method van de interface niet implementeerd.

Wat doe ik fout?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
    public class UriComparer : IComparer
    {

        public int Compare(Uri url,Uri currenturl)
        {
            string firstUrl = url.AbsoluteUri as firstUrl;
            string secondUrl = currenturl.AbsoluteUri as secondUrl;
        
            return firstUrl.CompareTo(secondUrl);
        }

    }


mijn sort aanroep:

C#:
1
2
3
4
5
public void RemoveDoubleUrlsFromResults(ref ArrayList results)
{
            UriComparer uriComparer = new UriComparer();
            results.Sort(uriComparer);
}


Alvast bedankt voor de hulp!

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 11-02 14:42
ik kan mij vergissen, maar ik zou iets verwachten als

'as String' in plaats van 'as firsturl'

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Als je IComparer implementeerd dan moet je de volgende functie hebben

C#:
1
2
public int Compare(object a, object b )
{}


Anders moetj e IComparer<Uri> implementeren. Dan klopt jouw implementatie wel

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:35
Ik denk dat _BRAINLESS de nagel op de kop slaat.
Wellicht krijg je naast die ene compiler error ook nog andere errors, en is de foutmelding die je nu vernoemt, het gevolg van de syntax-errors in je Compare method.

https://fgheysels.github.io/


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 13-02 20:06

Gerco

Professional Newbie

Volgens MSDN moet je het zo doen:
C#:
1
2
3
4
5
6
   public class myReverserClass : IComparer  {

      // Calls CaseInsensitiveComparer.Compare with the parameters reversed.
      int IComparer.Compare( Object x, Object y )  {
          return( (new CaseInsensitiveComparer()).Compare( y, x ) );
      }


Dus de parameters zijn van type Object ipv het type Uri (of wat je dan ook aan het comparen bent).

[edit]
Lekker voorbeeld trouwens, je zal op die manier maar 10k objecten gaan vergelijken, zit je 10k CaseInsensitiveComparer's te creeren. Ik hoop dat .NET ook "escape analysis" ondersteund... (al vermoed ik dat dat hier niet toe te passen is omdat het om een externe class gaat)

[ Voor 22% gewijzigd door Gerco op 05-09-2006 10:58 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:35
oeps, idd...
Alhoewel _BRAINLESS ook een punt heeft, moet de method natuurlijk dezelfde signature hebben als de signature in de interface. :)

https://fgheysels.github.io/


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
de signature was idd verkeerd en de "as" operator niet nodig.

Ik had een verkeerd voorbeeld gevolgd blijkbaar.

compilende code:

C#:
1
2
3
4
5
6
7
        int IComparer.Compare(object url,object currenturl)
        {
            string firstUrl = ((Uri)url).AbsoluteUri;
            string secondUrl = ((Uri)currenturl).AbsoluteUri;
        
            return firstUrl.CompareTo(secondUrl);
        }


Hij compiled wel maar de sort werkt niet naar behoren, maar dat zal nog wel opgelost worden!

thx allemaal

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 30-01 15:48

Not Pingu

Dumbass ex machina

4of9 schreef op dinsdag 05 september 2006 @ 10:59:

Hij compiled wel maar de sort werkt niet naar behoren, maar dat zal nog wel opgelost worden!
Dat is nou juist de reden dat je zelf een comparer schrijft. Je laat nu een string zichzelf met een andere string vergelijken en dat zal inderdaad geen goede sortering opleveren. Je zou bijv. kunenn sorteren op het domein (bijv. tweakers.net) en daarna op alle subdomeinen binnen dat domein (bijv gathering.tweakers.net, pda.tweakers.net, www.tweakers.net).

Daarvoor kun je zelf de verschillende onderdelen van een URI met elkaar vergelijken en de juiste returnwaarde berekenen.

Certified smart block developer op de agile darkchain stack. PM voor info.

Pagina: 1