[C#]Het kleinste nummer uit een array zoeken.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een applicatie aan het maken, waarbij ik gebruik maak van een struct en een array.
Oftewel, ik heb een struct die er zo uitziet:
code:
1
2
3
4
5
6
7
8
9
10
public struct Overzicht
        {
            public int id;
            public string merk;
            public string model;
            public int MBsize;
            public double prijs;
            public int voorraad;
            public double ppmb;
        }


En een array:
code:
1
2
3
4
5
6
7
            spelers[0].id = 1;
            spelers[0].merk = "GET technologies .inc";
            spelers[0].model = "HF 410";
            spelers[0].MBsize = 4096;
            spelers[0].prijs = 129.95;
            spelers[0].voorraad = 500;
            spelers[0].ppmb = spelers[0].prijs / spelers[0].MBsize;


En van die spelers heb ik er een aantal.
Maar nu de vraag, hoe krijg ik de speler, die de kleinste waarde bij spelers[0].ppmb heeft?

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Je zou kunnen itereren door de array middels foreach
Als de ppmb van het huidige item lager is dan de tot dan laagste waarde.

If money talks then I'm a mime
If time is money then I'm out of time


  • HuHu
  • Registratie: Maart 2005
  • Niet online
Met behulp van een for-loop.

  • Chester
  • Registratie: September 2003
  • Niet online
Ga naar google en zoek op 'find lowest value in array'. Of had je dat al geprobeerd?

"The test of a work of art is, in the end, our affection for it, not our ability to explain why it is good." - Stanley Kubrick | Trakt


Verwijderd

Topicstarter
Ja, google had ik al geprobeerd :P

En ik kan inderdaad wel met een forloop, of foreach, kijken welke de laagste is, dat is niet zo'n probleem.

Maar ik heb een beetje opheldering nodig, hoe ik dan zegmaar de naam van de speler erbij heb.
Er moet dan zegmaar uitkomen:
Speler <merk> <model> is het goedkoopst met <ppmb> zegmaar.

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Verwijderd schreef op woensdag 30 september 2009 @ 10:52:
Ja, google had ik al geprobeerd :P

En ik kan inderdaad wel met een forloop, of foreach, kijken welke de laagste is, dat is niet zo'n probleem.

Maar ik heb een beetje opheldering nodig, hoe ik dan zegmaar de naam van de speler erbij heb.
Er moet dan zegmaar uitkomen:
Speler <merk> <model> is het goedkoopst met <ppmb> zegmaar.
Je hebt toch de locatie binnen het array met de laagste prijs? dan kun je toch

speler[idvandelaagsteprijs].merk etc. gebruiken voor de weergave van de speler

[ Voor 3% gewijzigd door Matis op 30-09-2009 10:54 ]

If money talks then I'm a mime
If time is money then I'm out of time


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Matis schreef op woensdag 30 september 2009 @ 10:54:
speler[idvandelaagsteprijs].merk
Niet zo zeer ID alswel Index ;)

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


  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Ja, ik doelde op "spelers[0].id = 1;" uit de TS. Als je het over de array hebt is index een beter woord/omschrijving.

If money talks then I'm a mime
If time is money then I'm out of time


  • user109731
  • Registratie: Maart 2004
  • Niet online
Ik zou gewoon een referentie naar het Overzicht object houden:
C#:
1
2
3
4
5
6
7
Overzicht laagstePpmb = spelers[0];
for(int i=1; ...)
{
  if(spelers[i].ppmb < laagstePpmb.ppmb) 
    ...
}
bla(laagstePpmb.merk, laagstePpmb.model); //etc.

Verwijderd

Topicstarter
Ah, ja, heel logisch eigenlijk, maarja, het is nog vroeg :P
Hiermee heb ik het opgelost btw:

code:
1
2
3
4
5
6
7
8
9
10
11
            for (int a = 0; a < aantal; a++) 
            {
                ppmb = spelers[a].ppmb;
                if (ppmb < ppmb2)
                {
                    ppmb2 = ppmb;
                    id = a;
                }

            }
            Console.WriteLine("De MP3 speler met de laagste prijs per MB is: {0} {1} met {2} per MB", spelers[id].merk, spelers[id].model, spelers[id].ppmb);

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 05-08 09:21

Not Pingu

Dumbass ex machina

C#:
1
2
3
4
5
6
Overzicht goedkoopste;
foreach(Overzicht speler in spelers)
{
    if(goedkoopste==null || speler.ppmb < goedkoopste.ppmb)
        goedkoopste=speler;
}

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


  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op woensdag 30 september 2009 @ 10:52:
Ja, google had ik al geprobeerd :P

En ik kan inderdaad wel met een forloop, of foreach, kijken welke de laagste is, dat is niet zo'n probleem.

Maar ik heb een beetje opheldering nodig, hoe ik dan zegmaar de naam van de speler erbij heb.
Er moet dan zegmaar uitkomen:
Speler <merk> <model> is het goedkoopst met <ppmb> zegmaar.
Dan moet je tijdens het doorlopen het ID (of de index) onthouden.

Pseudo-code:

code:
1
2
3
4
5
6
7
8
9
laagsteIndex = 0;
laagstePrijs = Infinite;

for (i = 0; i < spelers.size; i++) {
  if (spelers[i].prijs < laagstePrijs) {
    laagsteIndex = i;
    laagstePrijs = spelers[i].prijs;
  }
}


Aan het einde heb je dan de index van de speler met de laagste prijs, opgeslagen in de variabele laagsteIndex.

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Anders ben ik ff lekker op tijd :').

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 17-09 20:55
code:
1
spelers.Min(s=>s.ppmb).Model

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17-09 21:27

Creepy

Tactical Espionage Splatterer

Eeh sorry? Je vraagt iets wat in principe vrij eenvoudig is op te lossen met een beetje basiskennis. Je geeft niet aan wat je zelf al hebt geprobeerd en wat daar niet mee lukte. En dat is nu juist wel iets wat we hier verwachten. Wil je daar een volgende keer op letten?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • analog_
  • Registratie: Januari 2004
  • Niet online
Kon je dit ook niet oplossen met een anonieme delegate in c# ?

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 17-09 18:39

Matis

Rubber Rocket

Mr.SiS schreef op woensdag 30 september 2009 @ 11:25:
Kon je dit ook niet oplossen met een anonieme delegate in c# ?
Of met Query Keywords, performen misschien niet zo lekker, maar zou kunnen ;)

If money talks then I'm a mime
If time is money then I'm out of time


Verwijderd

Topicstarter
Creepy schreef op woensdag 30 september 2009 @ 11:21:
Eeh sorry? Je vraagt iets wat in principe vrij eenvoudig is op te lossen met een beetje basiskennis. Je geeft niet aan wat je zelf al hebt geprobeerd en wat daar niet mee lukte. En dat is nu juist wel iets wat we hier verwachten. Wil je daar een volgende keer op letten?
Ik zou er de volgende keer op letten, sorry :)
Maar ik had eventjes opheldering nodig, want het was inderdaad wel erg simpel.

Bedankt allemaal, het is nu gelukt :)

  • DarthDavy
  • Registratie: Januari 2007
  • Laatst online: 06-06 16:12

DarthDavy

Excellent!

code:
1
var query = spelers.Where(x => x.ppmb == spelers.Min(y => y.ppmb));


query bevat een lijstje van spelers die de laagste ppmb hebben.

Bier zonder alcohol is zoals een BH aan de wasdraad: het beste is eruit


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Min() returnt de laagste waarde, niet het object dat die laagste waarde heeft.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DarthDavy
  • Registratie: Januari 2007
  • Laatst online: 06-06 16:12

DarthDavy

Excellent!

Vandaar de where extension method ervoor

Edit:

oooops, twas niet tegen mij O-)

[ Voor 36% gewijzigd door DarthDavy op 30-09-2009 12:35 ]

Bier zonder alcohol is zoals een BH aan de wasdraad: het beste is eruit


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Klopt ;)
Zou je om efficientie-redenen niet beter de Min() aanroep buiten de Where() trekken? Anders wordt dat per element geevalueerd (waardoor het O(n2) wordt)

[ Voor 6% gewijzigd door .oisyn op 30-09-2009 12:36 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
.oisyn schreef op woensdag 30 september 2009 @ 12:36:
Klopt ;)
Zou je om efficientie-redenen niet beter de Min() aanroep buiten de Where() trekken? Anders wordt dat per element geevalueerd (waardoor het O(n2) wordt)
Weet je dat zeker? Linq doet best veel tjap met deferred execution e.d., zou denken dat ie dat wel optimaliseert.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dunno, feitelijk pass je 'm gewoon delegates. In de outer delegate staat dat ie een Min() moet uitvoeren, en die delegate wordt geevalueerd per element in de lijst. Wellicht dat ie slim genoeg is om te zien dat select.Min() invariant is en geen side effects heeft, maar eerlijk gezegd betwijfel ik dat. Als je de implementatie van Min() zou replacen met iets dat alle elementen uit de enumeration naar scherm print, dan wil ik wel dat ik N keer alle elementen zie.

[ Voor 21% gewijzigd door .oisyn op 30-09-2009 12:56 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DarthDavy
  • Registratie: Januari 2007
  • Laatst online: 06-06 16:12

DarthDavy

Excellent!

Ik denk dat ie wel eerst de Min() doet en dan pas de Where(), dus ik vermoed het statement opsplitsen in twee statements geen performancewinst zal opleveren. Wel makkelijk te testen natuurlijk.

Trouwens, als het hier over geen miljoenen items gaat, doet het er zowiezo niet toe en dan nog...Een struct met 3 int's, 2 doubles en 2 strings is ook niet echt iets om over naar huis te schrijven.

Kunnen we evengoed gaan stellen dat een klasse beter zou zijn dan een struct...

Bier zonder alcohol is zoals een BH aan de wasdraad: het beste is eruit


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Toch wel
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CsTest1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> l = new List<int>();
            for (int i = 0; i < 20000; i++)
                l.Add(i);

            DateTime t = DateTime.Now;
            l.Where(i => i == l.Max()).ToList<int>();
            System.Console.WriteLine(DateTime.Now - t);

            t = DateTime.Now;
            int max = l.Max();
            l.Where(i => i == max).ToList<int>();
            System.Console.WriteLine(DateTime.Now - t);
        }
    }
}

00:00:04.1093750
00:00:00

En als ik het aantal elementen in de lijst met 2 vermenigvuldig, duurt de looptijd 4x zo lang (wat dus typisch O(n2) is).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • DarthDavy
  • Registratie: Januari 2007
  • Laatst online: 06-06 16:12

DarthDavy

Excellent!

Ok... Voor de OP dan

code:
1
2
double ppmbMin = spelers.Min(x => x.ppmb);
var query = spelers.Where(x => x.ppmb == ppmbMin);

Bier zonder alcohol is zoals een BH aan de wasdraad: het beste is eruit


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Toch werkt tot zo'n 100000 elementen het volgende ook heel aardig:
C#:
1
l.OrderBy(a => -a).First()

En anders wordt het tijd voor meer extentiefuncties. :)

Kijk trouwens eens naar Enumerable.Range(0,20000).ToList() en evt Stopwatch.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

pedorus schreef op woensdag 30 september 2009 @ 14:09:
Kijk trouwens eens naar Enumerable.Range(0,20000).ToList() en evt Stopwatch.
Ik kijk nergens naar, ik code nooit C#, en ik ben het niet van plan binnen afzienbare tijd te doen :Y). Het doel was iets te bewijzen, niet een codevoorbeeld geven. Maar toch bedankt voor de tips ;)

[ Voor 26% gewijzigd door .oisyn op 30-09-2009 14:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Als je echte classes gebruikt ipv een lijst integers in de testcase krijg je inderdaad vergelijkbare resultaten:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Test
    {
        public String name { get; set; }
        public int number { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Test> l = new List<Test>();
            for (int i = 0; i < 10000; i++)
            {
                l.Add(new Test { name = i.ToString(), number = i } );
            }

            DateTime t = DateTime.Now;
            l.Single(p => p.number == l.Max(i => i.number));

            System.Console.WriteLine(DateTime.Now - t);

            t = DateTime.Now;
            int max = l.Max(i => i.number);
            l.Single(i => i.number == max);

            System.Console.WriteLine(DateTime.Now - t);

            System.Console.ReadKey();
        }
    }
}


00:00:11.7440000
00:00:00.0030000

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1