Collections - welk type wil ik gebruiken?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Hoi Tweakers,

Ik heb een vraagje ivm een C# project waar ik momenteel aan het werken ben.
Ik moet een collectie bijhouden van 4 variabelen (zijnde een mac adres, ip adres, signaalsterkte en een timestamp)
Initieel dacht ik om met een dictionary te werken en het mac adres als identifier te gebruiken. De rest van de variabelen zou ik dan als object of in een tuple bewaren. Dit is echter geen optie want ik zal meedere entries hebben met hetzelde mac adres (welliswaar met een ander ip). Hashtable geeft hetzelfde probleem, list lijkt ook niet ideaal. Ik zou graag weten welk collectie mij het best kan dienen.
Voorwaarden zijn:
* moet performant zijn (collectie kan enkele honderden entries hebben)
* moet op mac adres kunnen zoeken en er zullen meerdere entries met hetzelfde mac adres bestaan, moet dus een collectie kunnen terug krijgen.
* de timestamp(s) moeten gemakkelijk op te vragen zijn aan hand van het mac adres
* collectie met generics zou leuk zijn

Moest er nog wat niet duidelijk zijn leg ik het graag nog even uit.
Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • spone
  • Registratie: Mei 2002
  • Niet online
Misschien is een ArrayList een idee?

i5-14600K | 32GB DDR5-6000 | RTX 5070 - MacBook Pro M1 Pro 14" 16/512


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

spone schreef op zaterdag 17 maart 2012 @ 00:16:
Misschien is een ArrayList een idee?
Hoezo dan? Dan moet je zodra je een element nodig hebt aan de hand van een macaddress moet je de hele verzameling doorlopen.




De oplossing voor jouw probleem is een multimap. Deze zit er echter niet standaard in de library van .NET. Hier is een voorbeeldimplementatie. In die map stop je dan de objecten met als key het macaddress.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
spone schreef op zaterdag 17 maart 2012 @ 00:16:
Misschien is een ArrayList een idee?
Dan moet ik altijd heel de collectie doorlopen?

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Multimap is de oplossing. Overigens ga je bij "enige honderden" entries echt niet tegen performanceproblemen aanlopen, tenzij je echt heeel vaak moet zoeken.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Lunacy schreef op zaterdag 17 maart 2012 @ 00:24:
[...]


Dan moet ik altijd heel de collectie doorlopen?
Als de collectie zoals je zegt maar een paar honderd entries groot is moet dat geen probeel zijn toch? Het ligt er maar net aan hoe vaak die lijst opgevraagd en doorzocht wordt, en hoeveel moeite je er in wilt steken.

Als je altijd wilt zoeken op mac-adres, maar er meerdere entries per mac-adres kunnen zijn, bouw je een map op met mac als key en een lijst als value.

Optie 3 is gebruik maken van een extern opslagsysteem zoals een database of NoSQL oplossing, maar dat komt voornamelijk omdat ik zelf niet weet of er een 'arraylist met index op mac-adres' type collectie bestaat daarbuiten.

Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
CoolGamer schreef op zaterdag 17 maart 2012 @ 00:24:
[...]De oplossing voor jouw probleem is een multimap. Deze zit er echter niet standaard in de library van .NET. Hier is een voorbeeldimplementatie. In die map stop je dan de objecten met als key het macaddress.
Het enige verschil is dan dat die meerdere objecten aan dezelde key kan koppelen?

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Lunacy schreef op zaterdag 17 maart 2012 @ 00:28:
[...]


Het enige verschil is dan dat die meerdere objecten aan dezelde key kan koppelen?
Ja, dat is het enige verschil.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Lunacy schreef op zaterdag 17 maart 2012 @ 00:28:
[...]


Het enige verschil is dan dat die meerdere objecten aan dezelde key kan koppelen?
Ja.

[ Voor 80% gewijzigd door Herko_ter_Horst op 17-03-2012 00:32 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Aha, dat lijkt wel wat dan. Hoe werkt het dan precies als ik de value op vraag aan de hand van de key?
Voorbeeldje mss?

(collectie moet heel vaak doorzocht worden idd)

[ Voor 17% gewijzigd door Lunacy op 17-03-2012 00:32 ]


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

In de code staat gewoon commentaar bij de methodes. Dat moet toch wel zelf lukken om daaruit de juiste methode te vinden en die methode vervolgens te gebruiken?

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Een andere optie is om een samengestelde key te gebruiken, bijv. het MAC adres en het IP adres samen als key te gebruiken.
Lunacy schreef op zaterdag 17 maart 2012 @ 00:30:
Aha, dat lijkt wel wat dan. Hoe werkt het dan precies als ik de value op vraag aan de hand van de key?
Voorbeeldje mss?
Wat snap je niet aan de code waar CoolGamer naar linkte?

En wat bedoel jij met "vaak"? Ik bedoel meerdere duizenden keren per seconde.

[ Voor 8% gewijzigd door Herko_ter_Horst op 17-03-2012 00:36 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Had de comments nog niet bekeken en een voorbeeldje vind ik altijd gemakkelijk maar het moet wel lukken zo

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 00:53
Hoezo moeten er losse waardes inzitten, waarom geen struct met die 4 properties, waarna je al die objecten in een List<T> oid gooit? Kun je prima met behulp van Enumerable.Where() doorzoeken lijkt me.

Keuze voor de collectie hangt overigens heel erg af van de manier waarop je hem gaat benaderen, de grootte, of hij vaak verandert van grootte, etc.

Zoiets dus:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct Item
{
    public string MacAddress { get; set; }
    public string IpAddress { get; set; }
    public int SignalStrength { get; set; }
    public DateTime TimeStamp { get; set; }
}

class Program
{
    static void Main()
    {
        List<Item> items = new List<Item>();
        items.Add(new Item());

        IEnumerable<Item> foundItems = items.Where(x => x.MacAddress == "1234567890");

        foreach (Item foundItem in foundItems)
        {
            Console.WriteLine("{0} - {1}", foundItem.IpAddress, foundItem.TimeStamp);
        }
    }
}

[ Voor 46% gewijzigd door Avalaxy op 17-03-2012 01:04 ]


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Hm, ook interessant.
Gaat een struct performanter zijn dan wanneer ik het in een object steek?
Met de multivaluedictioanry heb ik nu normaal ook wel performantievoordeel bij het zoeken omdat de key gehasht is toch?

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Struct vs. object ga je niet merken qua performance. Lijst vs. map zoals gezegd ook niet heel erg bij enige honderden items, tenzij het echt vaak moet.

Als je het zeker wilt weten: programmeer 2 of 3 opties uit en ga de performance meten. Je kunt je er vooraf heel druk om maken, maar dat leidt alleen maar tot premature optimization.

Pak de oplossing die het duidelijkst weergeeft wat je wilt doen en kijk of het snel genoeg is.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ben wat laat in 't topic, maar hier en hier zou je wel wat aan hebben gehad; al was 't maar voor een goede basis :P Struct vs object: boeie; tenzij je in een tight loop zit waar je een paar honderdduizend keer iets uitvoert ga je daar niets van merken (en zelfs al zat je in zo'n tight loop: het zal waarschijnlijk verwaarloosbaar zijn, maar in zo'n geval meten == weten).

[ Voor 25% gewijzigd door RobIII op 17-03-2012 11:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Lunacy
  • Registratie: Juni 2008
  • Laatst online: 27-10-2024
Oké bedankt allemaal. Lijkt me goed advies.
Heb momenteel de multivalue dictionary met objecten geimplementeerd.
Ga is kijken wat dat geeft, voorlopig lijkt zich dat goed te lenen voor mijn doel.
Pagina: 1