5. 02.03.2011 5
Schlüsselwort: var
• var = automatische Typ Ableitung
• abgeleiteter Typ fest (unveränderbar)
int x=12345; var x=12345;
string test=“Hallo“; äquivalent var test=“Hallo“;
Point punkt=new Point(); var punkt=new Point();
6. 02.03.2011 6
Anonyme Typen
Schlüsselwort var
Initialisierungsliste
9. 02.03.2011 9
Schlüsselwort: yield
class Points
{
private Random numberGenerator = new Random();
public int Count { get; set; }
public int Max { get; set; }
public int Min { get; set; }
public IEnumerable<Point> GeneratePoints
{
get
{
for (int counter = 0; counter < Count; counter++)
{
yield return new Point
{
X = numberGenerator.Next(Min, Max),
Y = numberGenerator.Next(Min, Max)
};
}
}
}
}
10. 02.03.2011 10
Schlüsselwort: yield
static void Main(string[] args)
{
Points generator = new Points { Min = 1, Max = 10, Count = 10 };
foreach (Point current in generator.GeneratePoints)
{
Console.WriteLine("({0},{1})", current.X, current.Y);
}
Console.ReadLine();
}
12. 02.03.2011 12
Lambda - Beispiel
static void Main(string[] args)
{
Func<int, int, int> Summe = (a, b) => a + b;
Func<int, int, int, int> Summe = (a, b, c) => a + b + c;
Action<int> Print =
number => Console.WriteLine("Ergebnis: {0}", number);
Print(Summe(3, 4));
Print(Summe(10, 5));
Print(Summe(10, 5, 4));
}
13. 02.03.2011 13
Was ist LINQ?
• Language Integrated Query
• from item in collection where xxx select yyy
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var even = from x in numbers where x % 2 == 0 select x;
var doubleNumbers = from x in numbers select x * 2;
var textNumbers = from x in numbers select "Nummer: " + x.ToString();
14. 02.03.2011 14
LINQ-Quellen
• Abfragetypen
– Objekte
– XML
– Datenbank
– viele weitere
• Amazon, Bing, SAP, ………….
15. 02.03.2011 15
LINQ-Theorie
from
• fließbandartiges
Abarbeiten
• beliebiges Verketten
möglich
• Lazy-Evaluation select where
16. 02.03.2011 16
LINQ – Syntax-Varianten
Lambda – Variante Query Comprehension
• list.where(a=>a%2==0) • from x in y select z
• Aufruf von Methoden • SQL ähnliche Syntax
• Übergeben von Lambda- • komprimierte Ausdrücke
Ausdrücken
17. 02.03.2011 17
LINQ - Schlüsselwörter
• from – Iterieren von Werten | Kreuzprodukt
• where – Filtern von Werten
• order x by y – Sortieren
• group x by y into z – Gruppieren
• select – Projezieren
18. 02.03.2011 18
LINQ Beispiel 1
var Personen = new[]
{
new {Name="Carl", ID=0}, new {Name="Max Mustermann", ID=1}, new {Name="Müller", ID=2}
};
var Produkte = new[]
{
new {ID=0, Name="Bleistift", Preis=1.5}, new {ID=1, Name="Papier", Preis=2.75}
};
var Bestellungen = new[]
{
new {Kunde=0, Produkt=0, Menge=2 },new {Kunde=0, Produkt=2, Menge=1 },
new {Kunde=1, Produkt=0, Menge=2 },new {Kunde=0, Produkt=3, Menge=3 }
};
var KundenBestellungen = from posten in Bestellungen
group posten by posten.Kunde into gruppe select new { KundenID = gruppe.Key, Bestellungen = gruppe };
var GesamtSumme = from kunde in Personen from gruppe in KundenBestellungen
where kunde.ID == gruppe.KundenID
select new {
Name = kunde.Name,
GesamtKosten =
( from produkt in Produkte from posten in gruppe.Bestellungen where produkt.ID == posten.Produkt
select posten.Menge * produkt.Preis).Sum()
};
19. 02.03.2011 19
LINQ Beispiel 2
static int ggT(int a, int b)
{
while (b != 0){int h = a % b; a = b; b = h;}
return a;
}
static void Main(string[] args)
{
var Zahlen = Enumerable.Range(2, 20);
var WertePaare = from a in Zahlen from b in Zahlen select new Tuple<int, int>(a, b);
var gleicherGGT = from item in WertePaare
group item by ggT(item.Item1, item.Item2) into ggT_Group
where ggT_Group.Count()>2 && ggT_Group.Key!=1
select new { GGT = ggT_Group.Key, Werte = ggT_Group };
foreach (var item in gleicherGGT)
{
Console.WriteLine("ggT: {0}",item.GGT);
foreach (var pair in item.Werte) Console.Write("({0}|{1}) ", pair.Item1, pair.Item2);
Console.WriteLine();
}
}
20. 02.03.2011 20
LINQ to XML
• X-DOM -> performant und LINQ optimiert
XAttribute
XElement
XElement XText
XDocument XElement
XElement XComment
XDocument doc = new XDocument();
doc.Add(
new XElement(XName.Get("Root"), Funktionales Erzeugen
new XElement(XName.Get("Left"),
new XAttribute(XName.Get("Key"),"Value"),
new XElement(XName.Get("Inner"),new XText("Inhalt"))
),
new XElement(XName.Get("Right"),new XComment("Comment"))
)
);
Console.Write(doc.ToString());
21. 02.03.2011 21
LINQ to XML - Beispiel
var doc = XDocument.Load("http://www.stnc.de/Feeds/News");
var allLinks =
from item in doc.Descendants(XName.Get("item"))
where item.Element(XName.Get("title")).
Value.Contains("Windows")
select item.Element(XName.Get("link")).Value;
foreach (var link in allLinks) Console.WriteLine(link);
22. PLINQ
• LINQ + Parallelität
• Enumarable.AsParallel
• Aufzählungen mit yield haben AsParallel
23. 02.03.2011 23
PLINQ Beispiel
var Zahlen = Enumerable.Range(2, 200);
var WertePaare = from a in Zahlen
from b in Zahlen
select new Tuple<int, int>(a, b);
var ggT_Werte = from item in WertePaare.AsParallel()
select new
{
ggT=ggT(item.Item1, item.Item2),Pair=item
};
foreach (var item in ggT_Werte)
{
Console.WriteLine("ggT({0},{1}): {2}",
item.Pair.Item1,item.Pair.Item2,item.ggT);
}
32. 02.03.2011 32
public class Vector
{
Beispiel
public int X { get; set; } public int Y { get; set; }
public static Vector operator+(Vector a, Vector b)
{ return new Vector { X = a.X + b.X, Y = a.Y + b.Y }; }
public static Vector operator ++(Vector input)
{ return new Vector { X = input.X + 1, Y = input.Y + 1 }; }
public override string ToString()
{ return string.Format("Point ({0}|{1})", X, Y); }
}
static void Main(string[] args)
{
Vector a = new Vector { X = 1, Y = 2 };
Vector b = new Vector { X = 2, Y = 3 };
Vector c = a + b;
Console.WriteLine(c++);Console.WriteLine(c++);
}