Avatar billede pumpin Nybegynder
18. juni 2006 - 18:15 Der er 15 kommentarer og
2 løsninger

Hvordan gennemløber jeg smartes en liste<>

Hej eksperter.


jeg har lavet en metode som skal gennemløbe en list af objecter. og adde de objecter som ligger mellem den min og max værdi som brugeren indtaster til en ny sorted liste.

PT har jeg prøvet det her.

    public List<Bolig> Seacht(string type, int bAMin, int gAMin, float pMin, float lnMin, float lbMin, int bAMax, int gAMax, float pMax, float lnMax, float lbMax)
    {
        List<Bolig> SortedList = new List<Bolig>();

        bool AddB = false;
        foreach(Bolig bol in objList)
        {
            if (bol.BType == btype)
            {
                if (bol.GAreal > gAMin || bol.GAreal < gMax)
                {
                    if (bol.BArealr > bAMin || bol.BArealr < boligAMax)
                    {
                        if (bol.SalgsPris > prisMin || bol.SalgsPris < prisMax)
                        {
                            if (bol.LejeNetto > lejeNettoMin || bol.LejeNetto < lejeNettoMax)
                            {
                                if (bol.LejeBrutto > lejeBruttoMin || bol.LejeBrutto < lejeBruttoMax)
                                {
                                    AddBolig = true;
                                }
                                else
                                {
                                }

                            }
                            else
                            {
                            }
                        }
                        else
                        {
                        }
                    }
                    else
                    {
                    }
                   
                }
                else
                {
                }
            }
            else
            {
            }

            if (AddBolig)
            {
                SortedList.Add(bol);
            }

        }//end foreach

        return SortedList;
    }
nogen som ha andre gode ider ?
Avatar billede esbenp Nybegynder
18. juni 2006 - 18:37 #1
Man kan omskrive det til følgende:

  public List<Bolig> Seacht(string type, int bAMin, int gAMin, float pMin, float lnMin, float lbMin, int bAMax, int gAMax, float pMax, float lnMax, float lbMax)
    {
        List<Bolig> SortedList = new List<Bolig>();

        bool AddB = false;
        foreach(Bolig bol in objList)
        {
            if (bol.BType != btype)
                continue;
            if (!(bol.GAreal > gAMin || bol.GAreal < gMax))
                continue;
            if (!(bol.BArealr > bAMin || bol.BArealr < boligAMax))
                continue;
            if (!(bol.SalgsPris > prisMin || bol.SalgsPris < prisMax))
                continue;
            if (!(bol.LejeNetto > lejeNettoMin || bol.LejeNetto < lejeNettoMax))
                continue;
            if (!(bol.LejeBrutto > lejeBruttoMin || bol.LejeBrutto < lejeBruttoMax))
                continue;
            SortedList.Add(bol);

        }//end foreach

        return SortedList;
    }


Men ellers Ligner dette umildbart et job for din database hvis du bruger sådan en.
Avatar billede pumpin Nybegynder
18. juni 2006 - 18:56 #2
det gør jeg skam. men er det ikke smarter at lave søgningen i min liste når jeg nu har den til rådighed, plus det ville da blive en ondskabsfuld sql streng :D
Avatar billede nielle Nybegynder
18. juni 2006 - 19:11 #3
Lister har en indbygget sorterings-mekanisme.

Her anvendt på et lille simeplt eksempel:

using System;
using System.Collections.Generic;

namespace e716180
{
    class Program
    {
        static List<int> blandedeTal = new List<int>();

        static void Main(string[] args)
        {
            Random tilfældet = new Random();
            for (int i = 1; i <= 10; i++)
                blandedeTal.Add(tilfældet.Next(1000));

            Console.WriteLine("Alle tallene:");
            foreach (int tal in blandedeTal)
                Console.WriteLine(tal);

            Predicate<int> erTalletLige = new Predicate<int>(ErTalletLige);
            List<int> deLigeTal = blandedeTal.FindAll(erTalletLige);

            Console.WriteLine();
            Console.WriteLine("Kun de lige tal:");
            foreach (int tal in deLigeTal)
                Console.WriteLine(tal);
        }

        public static bool ErTalletLige(int etVilkårligtTal)
        {
            if (etVilkårligtTal % 2 == 0)
                return true;
            else
                return false;
        }
    }
}
Avatar billede nielle Nybegynder
18. juni 2006 - 19:13 #4
"sorterings-mekanisme" var et forkert ordvalg: "søgnings-mekanisme" ville have været bedre.

Men lister har forresten også en indbygget sorterings-mekanisme. :^)
Avatar billede pumpin Nybegynder
18. juni 2006 - 19:25 #5
esbenp. det virker ikke helt. den retunere kun ET result lige hveget hvad jeg skriver :(
Avatar billede pumpin Nybegynder
18. juni 2006 - 19:40 #6
nogen forslag ?
Avatar billede nielle Nybegynder
18. juni 2006 - 19:41 #7
Har du kigget på 18/06-2006 19:11:11?
Avatar billede esbenp Nybegynder
18. juni 2006 - 20:15 #8
pumpin virkede dit eksempel før jeg omskrev det?
Avatar billede pumpin Nybegynder
18. juni 2006 - 20:43 #9
nej :)
Avatar billede pumpin Nybegynder
18. juni 2006 - 20:45 #10
nej til espenp og ja til nielle, skullejeg så bare liste et predicate op for hver kriterie jeg har ?
Avatar billede nielle Nybegynder
18. juni 2006 - 20:51 #11
Det skulle vel være muligt at lave et predicate som håndtere alle kriterierne i et hug.
Avatar billede nielle Nybegynder
18. juni 2006 - 21:07 #12
Et bud:

public static bool Søgning(<Bolig> bolig)
{
    if (bolig.GAreal < gAMin || gMax < bolig.GAreal) return false;
    if (bolig.BArealr < bAMin || bAMax < bolig.BArealr) return false;
    if (bolig.SalgsPris < prisMin || prisMax < bolig.SalgsPris) return false;
    if (bolig.LejeNetto < lejeNettoMin || lejeNettoMax < bolig.LejeNetto) return false;
    if (bolig.LejeBrutto < lejeBruttoMin || lejeBruttoMax < bolig.LejeBrutto) return false;

    return true;
}
Avatar billede nielle Nybegynder
18. juni 2006 - 21:11 #13
Jeg tror i øvrigt at hovedårsagen til at den oprindelige kode ikke virkede, er at du jo nok skal rette sådan noget som:

if (bol.GAreal > gAMin || bol.GAreal < gMax)

til:

if (bol.GAreal > gAMin && bol.GAreal < gMax)

- eller, som jeg selv foretrækker det:

if (gAMin < bol.GAreal && bol.GAreal < gMax)

- og for at det giver endnu mere mening:

if (gAMin <= bol.GAreal && bol.GAreal <= gMax)
Avatar billede pumpin Nybegynder
18. juni 2006 - 21:11 #14
fuck det drenge jeg twister bare noget SQL.. som klare det. kom med et svar hver så deler i bare points.. for ulegligheden.

ked af jeg tog jeres tid men jeg fikser det bare med noget SQL den her gang, men jeg vil have de predicates i baghovedet til når man ellers arbejder med lister..
tak for jers tid !
Avatar billede esbenp Nybegynder
18. juni 2006 - 21:23 #15
ok
Avatar billede nielle Nybegynder
18. juni 2006 - 21:41 #16
Jeg syens da at du skulle kaste dig over problemet og se det som en udfordring der skal knækkes :^)
Avatar billede nielle Nybegynder
18. juni 2006 - 21:49 #17
Ang. prdikater og lister, så får du lige et større eksempel hvor der også sorteres:

using System;
using System.Collections.Generic;

namespace e716180
{
    class Program
    {
        static void Main(string[] args)
        {
            // Vi opretter listen.

            List<int> blandedeTal = new List<int>();

            Random tilfældet = new Random();
            for (int i = 1; i <= 10; i++)
                blandedeTal.Add(tilfældet.Next(1000));

            Console.WriteLine("Alle tallene:");
            foreach (int tal in blandedeTal)
                Console.WriteLine(tal);

            // Vi søger i listen efter de lige tal.

            Predicate<int> erTalletLige = new Predicate<int>(ErTalletLige);
            List<int> deLigeTal = blandedeTal.FindAll(erTalletLige);

            Console.WriteLine();
            Console.WriteLine("Kun de lige tal:");
            foreach (int tal in deLigeTal)
                Console.WriteLine(tal);

            // Vi sortere listen af de lige tal i stigende orden.

            Comparison<int> stigendeSortering = new Comparison<int>(SorterStigende);
            deLigeTal.Sort(stigendeSortering);

            Console.WriteLine();
            Console.WriteLine("De lige tal i sorteret rækkefølge:");
            foreach (int tal in deLigeTal)
                Console.WriteLine(tal);
        }

        public static bool ErTalletLige(int etVilkårligtTal)
        {
            if (etVilkårligtTal % 2 == 0)
                return true;
            else
                return false;
        }

        public static int SorterStigende(int a, int b)
        {
            if (a > b)
                return 1;
            else if (a == b)
                return 0;
            else
                return -1;
        }
    }
}
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