Difference between revisions of "6237 Programmering II (Csharp) Agenda/List sort/find"

From Teknologisk videncenter
Jump to: navigation, search
(List sort/find)
m (added Category:Csharp using HotCat)
 
(4 intermediate revisions by one other user not shown)
Line 17: Line 17:
 
</source>
 
</source>
 
Det smarte ved at sætte personer i en list er at vi nu kan anvende indbyggede funktioner i list til at sortere og søge i listen.
 
Det smarte ved at sætte personer i en list er at vi nu kan anvende indbyggede funktioner i list til at sortere og søge i listen.
 +
Den nemmeste måde er at anvende lambdaexpressions
  
 
Det kræver dog at vi først oprette en "delegate" det vil sige en metode der kan hjælpe programmet med at sammenligne to objekter. Metoden tager to objekter at type person og returnerer -1, 1 eller 0 afhængig af hvilket objekt som er størst på den parameter der sammenlignes på.
 
Her ses metoderne SortByName og SortByEmail.
 
Sortering foregår således.
 
 
<source lang=csharp>
 
<source lang=csharp>
class Program
+
static void Main(string[] args)
 
{
 
{
 +
Person p1 = new Person("Tommy", "tommys@mail.dk");
 +
Person p2 = new Person("Jens", "jens@mail.dk");
 +
Person p3 = new Person("Holger", "holgers@mail.dk");
 +
List<Person> pLst = new List<Person>();
 +
pLst.Add(p1);
 +
pLst.Add(p2);
 +
pLst.Add(p3);
  
public static int SortByNavn(Person x, Person y)
+
        //Her findes første person i listen med navnet Holger
{
+
        Person holger = pLst.Find(x =>(x.Navn == "Holger"));
return String.Compare(x.Navn, y.Navn);
 
}
 
 
 
public static int SortByEmail(Person x, Person y)
 
{
 
return String.Compare(x.Email, y.Email);
 
}
 
 
 
static void Main(string[] args)
 
{
 
Person p1 = new Person("Tommy", "tommys@mail.dk");
 
Person p2 = new Person("Jens", "jens@mail.dk");
 
Person p3 = new Person("Holger", "holgers@mail.dk");
 
List<Person> pLst = new List<Person>();
 
pLst.Add(p1);
 
pLst.Add(p2);
 
pLst.Add(p3);
 
  
pLst.Sort(SortByNavn);
+
        //Her findes alle personer med navnet Holger
pLst.Sort(SortByEmail);
+
List<Person> holgerLst = pLst.FindAll(x =>(x.Navn == "Holger"));
}
 
 
}
 
}
 
</source>
 
</source>
  
På samme måde kan vi også anvende indbyggede søgefunktioner. Her skal vi lave en metode programmet kan anvende til at fortælle hvad der søges efter. I dette tilfælde navnet Jens.
+
På samme måde kan vi anvende listen til at sortere vores personer. Det eneste vi skal gøre at at lave et lambdaexpression der fortæller hvordan vi vil sortere.
<source lang=csharp>
 
class Program
 
{
 
String searchName;
 
static bool findName(Person p)
 
{
 
return p.Navn == searchName;
 
}
 
 
 
static void Main(string[] args)
 
{
 
Person p1 = new Person("Tommy", "tommys@mail.dk");
 
Person p2 = new Person("Jens", "jens@mail.dk");
 
Person p3 = new Person("Holger", "holgers@mail.dk");
 
List<Person> pLst = new List<Person>();
 
pLst.Add(p1);
 
pLst.Add(p2);
 
pLst.Add(p3);
 
  
searchName = "Jens";
 
Person p = pLst.Find(findName);
 
}
 
}
 
</source>
 
 
Hvis det skal være rigtig smart kan vi lave funktionen i vha en anden funktion. Her er det FindByName der returnerer en funktion der finder en navn.
 
<source lang=csharp>
 
class Program
 
{
 
static String searchName;
 
static bool findName(Person p)
 
{
 
return p.Navn == searchName;
 
}
 
 
static Predicate<Person> FindByName(String name)
 
{
 
return delegate(Person p)
 
{
 
return p.Navn == name;
 
};
 
}
 
 
static void Main(string[] args)
 
{
 
Person p1 = new Person("Tommy", "tommys@mail.dk");
 
Person p2 = new Person("Jens", "jens@mail.dk");
 
Person p3 = new Person("Holger", "holgers@mail.dk");
 
List<Person> pLst = new List<Person>();
 
pLst.Add(p1);
 
pLst.Add(p2);
 
pLst.Add(p3);
 
 
Person p = pLst.Find(FindByName("Holger"));
 
}
 
}
 
</source>
 
 
Endelig kan man anvende lambda expressions
 
 
<source lang=csharp>
 
<source lang=csharp>
 
static void Main(string[] args)
 
static void Main(string[] args)
Line 123: Line 51:
 
pLst.Add(p3);
 
pLst.Add(p3);
  
Person p = pLst.Find(x =>(x.Navn == "Holger"));
+
        //Her sorteres listen på personens navn
 +
        pLst.Sort((x,y) =>(String.Compare(x.Navn,y.Navn));
  
         //Eller evt.
+
         //Hvis der er ens navne kan vi vælge at sortere på emails
         pLst.Sort((x,y) =>(String.Compare(x.Navn,y.Navn));
+
         pLst.Sort((x, y) =>  
 +
            {
 +
                if (x.Navn != y.Navn) return String.Compare(x.Navn, y.Navn);
 +
                return String.Compare(x.Email, y.Email);
 +
            });
 
}
 
}
 
</source>
 
</source>
  
 +
 +
----
 +
 +
 +
Alternativt kan man vælge at sortere med delegates
 +
 +
[[/Sort_with_delegate|Sort with delegate]]
 
[[Category:6237 Programmering II]]
 
[[Category:6237 Programmering II]]
 +
[[Category:Csharp]]

Latest revision as of 13:28, 18 February 2016

List sort/find

Når vi har oprette klassen Person kan vi også lave en liste af personer. Da både larer og elev nedarver fra Person kan vi også gemme disse i listen. Det foregår sådan her.

static void Main(string[] args)
{
	Laerer l1 = new Laerer("Tommy", "tommys@mail.dk", 25000);
	
	Elev e1 = new Elev("Jens", "jens@mail.dk", "Hold1");
	
	Person p1 = new Laerer("Holger", "holgers@mail.dk",230000);

	List<Person> pLst = new List<Person>();
	pLst.Add(p1);
	pLst.Add(e1);
	pLst.Add(l1);
}

Det smarte ved at sætte personer i en list er at vi nu kan anvende indbyggede funktioner i list til at sortere og søge i listen. Den nemmeste måde er at anvende lambdaexpressions

static void Main(string[] args)
{
	Person p1 = new Person("Tommy", "tommys@mail.dk");		
	Person p2 = new Person("Jens", "jens@mail.dk");
	Person p3 = new Person("Holger", "holgers@mail.dk");
	List<Person> pLst = new List<Person>();
	pLst.Add(p1);
	pLst.Add(p2);
	pLst.Add(p3);

        //Her findes første person i listen med navnet Holger
        Person holger = pLst.Find(x =>(x.Navn == "Holger"));

        //Her findes alle personer med navnet Holger
	List<Person> holgerLst = pLst.FindAll(x =>(x.Navn == "Holger"));
}

På samme måde kan vi anvende listen til at sortere vores personer. Det eneste vi skal gøre at at lave et lambdaexpression der fortæller hvordan vi vil sortere.

static void Main(string[] args)
{
	Person p1 = new Person("Tommy", "tommys@mail.dk");		
	Person p2 = new Person("Jens", "jens@mail.dk");
	Person p3 = new Person("Holger", "holgers@mail.dk");
	List<Person> pLst = new List<Person>();
	pLst.Add(p1);
	pLst.Add(p2);
	pLst.Add(p3);

        //Her sorteres listen på personens navn
        pLst.Sort((x,y) =>(String.Compare(x.Navn,y.Navn));

        //Hvis der er ens navne kan vi vælge at sortere på emails
        pLst.Sort((x, y) => 
            {
                if (x.Navn != y.Navn) return String.Compare(x.Navn, y.Navn);
                return String.Compare(x.Email, y.Email);
            });
}




Alternativt kan man vælge at sortere med delegates

Sort with delegate