Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Datasets vergelijken

Pagina: 1
Acties:

  • Kevinp
  • Registratie: Juni 2001
  • Laatst online: 09-11 12:24
Ik krijg vanuit een verbinding een dataset binnen. Deze verbinding praat met een interface van een programma. Waar ik niks aan kan veranderen. Hierdoor moet ik dus in datasets gaan zoeken.

Echter wil ik kijken of de dataset veranderd is van inhoud zodat ik de gui (die aan de hand van die data wordt gevuld/opgebouwd) niet opnieuw of op de bouwen.

Wat ik nu doe/heb geprobeerd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//initialisatie in de constructor van de class
Dataset data = new Dataset()
Dataset old = new Dataset()


data = client.getdata() // return van de dataset
if (data.equals(old))
{
 //true
}
else 
{
//false
}
old = data;

dit werkt echter niet.

ook heb ik
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//initialisatie in de constructor van de class
Dataset data = new Dataset()
Dataset old = new Dataset()


data = client.getdata() // return van de dataset
if (data.tables[0].equals(old.tables[0]))
{
 //true
}
else 
{
 //false
}
old = data;

en hetzelfde voor de row collectie.

Wat ik nu als (tijdelijke) oplossing heb is de rows te counten, wat natuurlijk wel werkt.

Is er een manier om dit in een keer te doen, let wel er wordt dus altijd data opgehaald. Echter deze staat momenteel in een statische database waardoor ik zeker weet dat ik dezelfde data altijd krijg.

d'r is maar één ding in het leven wat moet, en dat is dood gaan.


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

Snake

Los Angeles, CA, USA

Dataset overriden, en dan de equals methode overriden :)

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


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
het lijkt me dat je met een soort functie als de volgende aardig ver moet komen

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public bool Equals(DataSet left, DataSet right)
{
    if(left.Tables.Count != right.Tables.Cout )
        return false;
    
    for(int ti = 0; ti < left.Tables.Count; ti++)
    {
        foreach( rows )
        {
            foreach( cells )
            {
                if( !left.Cell.Equals( right.Cell )
                    return false;
            }
        }
    }
    return true;
}

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


Verwijderd

Is het geen optie om de DataSet die je binnenkrijgt (?? snap niet helemaal wat je hiermee bedoelt, maar goed) direct te koppelen aan de GUI.
En dan wanneer gewenst DataSet.HasChanges( ) aan te roepen, of iets dergelijks.

Zitten er veranderingen in, bind dan opnieuw de data in de GUI.

  • Kevinp
  • Registratie: Juni 2001
  • Laatst online: 09-11 12:24
de data wordt verwerkt op een PDA, elke verwerkslag die ik niet hoef te doen doe ik niet. Helaas moet ik al data ophalen om te controleren of er nieuwe data is, dit vanwege een aantal beperkingen aan de andere kant.

Data kan je idd koppelen, maar ik wil deze data ook alleen maar koppelen als die veranderd is. Om dat te controleren kan dus niet omdat de volgorde altijd is:

data ophalen
data controleren
data verwerken(wanneer de data veranderd is).

De data is redelijk statisch, en het is zelfs zo dat bij de verandering van een van de datasets er een melding moet komen op het scherm.

Er wordt eigenlijk al te veel werwekt maar dat kan niet anders.

d'r is maar één ding in het leven wat moet, en dat is dood gaan.


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 09:17
Kevinp schreef op woensdag 14 mei 2008 @ 11:02:
<knip>

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//initialisatie in de constructor van de class
Dataset data = new Dataset()
Dataset old = new Dataset()


data = client.getdata() // return van de dataset
if (data.equals(old))
{
 //true
}
else 
{
//false
}
old = data;

dit werkt echter niet.
Op zich is de basis voor override van de equals method aanwezig, aangezien je op inhoud wilt vergelijken.

Wat je hier echter toepast, is een memory (aka ReferenceEquals) vergelijking van de DataSet class. Aangezien Dataset geen specifieke override van de equals method heeft zal deze via overerving de object equals toepassen, wat per definitie een ReferenceEquals/memory check is. Aangezien het 2 instances zijn met eigen memory locations, zal deze altijd false retourneren.

Je zult ook een override van GetHashCode moeten doen als je besluit een override van de equals method te doen. Zie MS guidelines (http://msdn.microsoft.com/en-us/library/336aedhh(VS.71).aspx)

Dit is de standaard template die veelal toegepast wordt bij een equals overrride:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class B
{
  public override bool Equals(object right)
  {
      if (right == null)
          return false;
      
      if (object.ReferenceEquals(this, right))
          return true;

      B rightAsB = right as B;

      if (rightAsB == null)
          return false;

     return CompareBMembers(this, rightAsB)
  }
}


(bron: Effective C#, door Bill Wagner)

Waarbij CompareBMembers de feitelijke inhoud checker is.

  • Kevinp
  • Registratie: Juni 2001
  • Laatst online: 09-11 12:24
Of je het nu override of een methode maakt om op inhoud te checken maakt eigenlijk niks uit. Behalve dat die override er leuk uit ziet, en je kan zeggen dat je dat gebruikt hebt.

Het blijft iig handwerk.

Het is jammer want een dataset doorlopen per rij is tijdrovend.

Voor mij is het waarschijnlijk voldoende om alleen op de laatste record te checken en daar naar te kijken. Deze zal namelijk veranderen wanneer er iets veranderd is(en eigenlijk dan de eerste ook).

d'r is maar één ding in het leven wat moet, en dat is dood gaan.


  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 13-11 10:30

mOrPhie

❤️❤️❤️❤️🤍

Kevinp schreef op woensdag 14 mei 2008 @ 16:30:
Het is jammer want een dataset doorlopen per rij is tijdrovend.

Voor mij is het waarschijnlijk voldoende om alleen op de laatste record te checken en daar naar te kijken. Deze zal namelijk veranderen wanneer er iets veranderd is(en eigenlijk dan de eerste ook).
Dat wilde ik net gaan zeggen. Het checken kun je natuurlijk goed optimaliseren. Eerst kijken of het aantal rijen is veranderd. Daarna vanaf de meest recente rijen gaan zoeken. Daarna eerst de meest wijzigende records checken. Bij het vinden van een wijziging verlaat je direct de loop. Als je dit ook nog 'ns in een Worker zet, lijdt de User Interface niet onder de vergelijkactie en kun je ergens in je UI feedback geven als "checking..." oid.

Optimaler is natuurlijk een vlaggetje of een event wanneer de data verandert wordt, maar als je die optie niet hebt, dan is bovenstaande waarschijnlijk "best bet".

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


  • JochemK
  • Registratie: Maart 2003
  • Laatst online: 18-11 20:15
Kun je niet een hash berekenen over je dataset? Dit moet volgens mij sneller kunnen dan het rij voor rij vergelijken. hashes vergelijken duurt ook niet zo lang.

In .NET zijn standaard al een heleboel hashfuncties beschikbaar. (System.Cryptography ofzo)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
kingjotte schreef op woensdag 14 mei 2008 @ 20:32:
Kun je niet een hash berekenen over je dataset? Dit moet volgens mij sneller kunnen dan het rij voor rij vergelijken. hashes vergelijken duurt ook niet zo lang.

In .NET zijn standaard al een heleboel hashfuncties beschikbaar. (System.Cryptography ofzo)
Als je een representatieve hash wilt maken zul je toch ook alle rows door moeten lopen! Dus sneller zal dat waarschijnlijk niet zijn. Tevens heb je bij alle rows vergelijken nog het voordeel dat als je een verschil vind dat je er dan meteen mee klaar bent. Als je hashes gaat vergelijke moet je altijd alles aflopen.

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


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-11 08:25

Janoz

Moderator Devschuur®

!litemod

Het is een beetje afhankelijk van hoe lang het doorlopen duurt en wat voor impact het heeft. Je zou best een hash bij kunnen houden van de huidige set waardoor je enkel de nieuwe hoeft door te lopen. Probleem is echter dat je geen optimalisaties kunt doen die mOrPhie aangeeft. Je weet pas helemaal aanhet einde of je hash goed is, terwijl je bij het vergelijken van het aantal records gelijk al kunt zien of een dataset gewijzigd is.

Hoe zit je architectuur trouwens in elkaar? Je hebt het over een pda en dat de GUI de bottleneck is. Maar als deze check op de pda uitgevoerd wordt dan lijkt het me eerder dat de datacommunicatie de bottleneck is en dat je misschien beter een tussenlaag ergens m0oet aanbrengen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

kingjotte schreef op woensdag 14 mei 2008 @ 20:32:
Kun je niet een hash berekenen over je dataset? Dit moet volgens mij sneller kunnen dan het rij voor rij vergelijken. hashes vergelijken duurt ook niet zo lang.
Uiteraard vertellen hashes je enkel dat iets ongelijk is. Om te achterhalen dat iets daadwerkelijk gelijk is zul je toch echt elk element moeten controleren.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij vertellen hashes je vooral of iets met redelijke zekerheid gelijk of ongelijk is. B)
Als data gelijk, dan hash gelijk. (zeker)
Als data ongelijk, dan hash ongelijk (waarschijnlijk).
Als hash gelijk, dan data gelijk (waarschijnlijk).

Ik zeg dit overigens met MD5 in het achterhoofd, volgens mij is een hash niets anders dan een verhaspeling van data waarvoor geldt dat dezelfde data altijd dezelfde hash oplevert.
En na een korte wikipedia opzoekactie:
Wikipedia: Hashfunctie O-)

Verwijderd

bigbeng schreef op donderdag 15 mei 2008 @ 09:28:
Ik zeg dit overigens met MD5 in het achterhoofd, volgens mij is een hash niets anders dan een verhaspeling van data waarvoor geldt dat dezelfde data altijd dezelfde hash oplevert.
En na een korte wikipedia opzoekactie:
Wikipedia: Hashfunctie O-)
Ik denk dat je een grove design fout maakt binnen een programma wanneer je tevreden bent met "waarschijnlijk gelijk" ;)

Tevens geldt voor een hashfunctie dat compleet verschillende data exact dezelfde hash kunnen opleveren. Dus blijft gewoon overeind staan dat je met een hash functie enkel kunt aantonen dat iets ongelijk is.

  • Kevinp
  • Registratie: Juni 2001
  • Laatst online: 09-11 12:24
mOrPhie schreef op woensdag 14 mei 2008 @ 16:49:
[...]


Dat wilde ik net gaan zeggen. Het checken kun je natuurlijk goed optimaliseren. Eerst kijken of het aantal rijen is veranderd. Daarna vanaf de meest recente rijen gaan zoeken. Daarna eerst de meest wijzigende records checken. Bij het vinden van een wijziging verlaat je direct de loop. Als je dit ook nog 'ns in een Worker zet, lijdt de User Interface niet onder de vergelijkactie en kun je ergens in je UI feedback geven als "checking..." oid.

Optimaler is natuurlijk een vlaggetje of een event wanneer de data verandert wordt, maar als je die optie niet hebt, dan is bovenstaande waarschijnlijk "best bet".
dit wordt het waarschijnlijk, ik zal eerst eens kijken of het werkt zonder threading, qua snelheid. Ik denk dat je daar namelijk bijna niks van merkt in mijn geval. Daarna met threading.

d'r is maar één ding in het leven wat moet, en dat is dood gaan.


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Verwijderd schreef op donderdag 15 mei 2008 @ 09:37:
[...]
Ik denk dat je een grove design fout maakt binnen een programma wanneer je tevreden bent met "waarschijnlijk gelijk" ;)

Tevens geldt voor een hashfunctie dat compleet verschillende data exact dezelfde hash kunnen opleveren. Dus blijft gewoon overeind staan dat je met een hash functie enkel kunt aantonen dat iets ongelijk is.
Mee eens, hoewel grof afhankelijk is van hoe erg het is als de uitzondering optreedt natuurlijk ;)

Ik wist dat ik iets vergeten was, namelijk:
Als hashes ongelijk, dan data ongelijk (zeker).

Vanuit de hash geredeneerd, waar het over ging, heb je dus volledig gelijk.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kevinp schreef op donderdag 15 mei 2008 @ 09:38:
[...]

dit wordt het waarschijnlijk, ik zal eerst eens kijken of het werkt zonder threading, qua snelheid. Ik denk dat je daar namelijk bijna niks van merkt in mijn geval. Daarna met threading.
Is het niet handiger/sneller om een stap ertussen te bouwen die op de server/pc kijkt of de data gelijk is gebleven?

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


  • Kevinp
  • Registratie: Juni 2001
  • Laatst online: 09-11 12:24
rwb schreef op donderdag 15 mei 2008 @ 10:20:
[...]

Is het niet handiger/sneller om een stap ertussen te bouwen die op de server/pc kijkt of de data gelijk is gebleven?
Ja, makkelijker wel, maar voor ons niet mogelijk omdat dat grote wijzigingen in het bestaande programma vereist, waar we geen toegang tot hebben.

d'r is maar één ding in het leven wat moet, en dat is dood gaan.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-11 08:25

Janoz

Moderator Devschuur®

!litemod

@rwb: dat gaf ik hier al aan Janoz in "\[C#] Datasets vergelijken"

@Kevinp:
Heb je nu al gekeken wat nu eigenlijk de bottleneck is? Ik krijg langzaam het idee dat je probeert het verkeerde probleem op te lossen, zeker omdat je dit blijkbaar allemaal op de PDA uitvoert.

Daarnaast is het natuurlijk helemaal niet onmogelijk om iets aan de serverkant te doen. Goed, de applicatie aanpassen is onmogelijk, maar waarom zou je niet voor een proxy achtige oplossing kunnen gaan? Op de server draai je nog een applicatie die de dataset verwerkt uit de originele applicatie en deze op een veel efficientere manier vervolgens aan de PDA's aanbiedt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 13-11 10:30

mOrPhie

❤️❤️❤️❤️🤍

Kevinp schreef op donderdag 15 mei 2008 @ 09:38:
[...]
Ik denk dat je daar namelijk bijna niks van merkt in mijn geval. Daarna met threading.
Threading gebruik je hier zodat je andere dingen kunt doen, terwijl de (wellicht tijdrovende) vergelijking bezig is. Niet om het geheel sneller te maken. :)

Ik ben echter met bovenstaand inzicht eens dat je de check beter serverside kunt houden. Waarschijnlijk is het vergelijken obv een modified-datum die je bij houdt dan voldoende. :)

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


  • Kevinp
  • Registratie: Juni 2001
  • Laatst online: 09-11 12:24
Janoz schreef op donderdag 15 mei 2008 @ 10:53:
@rwb: dat gaf ik hier al aan Janoz in "\[C#] Datasets vergelijken"

@Kevinp:
Heb je nu al gekeken wat nu eigenlijk de bottleneck is? Ik krijg langzaam het idee dat je probeert het verkeerde probleem op te lossen, zeker omdat je dit blijkbaar allemaal op de PDA uitvoert.

Daarnaast is het natuurlijk helemaal niet onmogelijk om iets aan de serverkant te doen. Goed, de applicatie aanpassen is onmogelijk, maar waarom zou je niet voor een proxy achtige oplossing kunnen gaan? Op de server draai je nog een applicatie die de dataset verwerkt uit de originele applicatie en deze op een veel efficientere manier vervolgens aan de PDA's aanbiedt.
De oplossing is relatief makkelijk geworden. Er komt nu een event op change, echter moet er nu via wcf gepushed worden naar de dpa. Op die manier wordt dus de data niet opgehaald, maar opgestuurd als het waren, of de aanvraag gedaan om deze op te halen.

d'r is maar één ding in het leven wat moet, en dat is dood gaan.

Pagina: 1