//? Mengen erzeugen
// Funktioniert natürlich auch mit double und decimal,
// aber genauso auch mit string und vielen anderen Typen. Auch eigene!
// Auch mit List<T> etc. ist LINQ verwendbar
int[] a = new int[] { 2, 3, 4, 5, 6 };
int[] b = new int[] { 2, 4, 6 };
int[] c = new int[] { 3, 5, };
int[] g = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//Grundmenge
int[] n = new int[0];//Lehre Menge
//? Schnittmenge
// Alle Elemente die in A und B enthalten sind
var v_1_1 = a.Intersect(b).ToArray();
var v_1_2 = a.Intersect(c).ToArray();
var v_1_3 = b.Intersect(c).ToArray();
//? Vereinigungsmenge
// Alle Elemente die in A oder B enthalten sind
var v_2_1 = a.Union(b).ToArray();
var v_2_2 = a.Union(c).ToArray();
var v_2_3 = b.Union(c).ToArray();
//? Differenzmenge
// Alle Elemente die in A aber nicht in B enthalten sind
var v_3_1 = a.Except(b).ToArray();
var v_3_2 = a.Except(c).ToArray();
var v_3_3 = b.Except(c).ToArray();
var v_3_4 = b.Except(a).ToArray();
var v_3_5 = c.Except(a).ToArray();
var v_3_6 = c.Except(b).ToArray();
//? Symmetrische Differenz
// Alle Elemente die nicht in A und B enthalten sind.
var v_4_1 = a.Concat(b).Except(a.Intersect(b)).ToArray();
var v_4_2 = a.Concat(c).Except(a.Intersect(c)).ToArray();
var v_4_3 = b.Concat(c).Except(b.Intersect(c)).ToArray();
//? Teilmenge?
// Ist A eine Teilmenge von B?
var v_5_1 = a.Where(x => b.Contains(x)).Count() == a.Count();
var v_5_2 = a.Where(x => c.Contains(x)).Count() == a.Count();
var v_5_3 = b.Where(x => c.Contains(x)).Count() == b.Count();
var v_5_4 = b.Where(x => a.Contains(x)).Count() == b.Count();
var v_5_5 = c.Where(x => a.Contains(x)).Count() == c.Count();
var v_5_6 = c.Where(x => b.Contains(x)).Count() == c.Count();
//? Komplementärmenge
// Elemente die in der Grundmenge, aber nicht in A enthalten sind
var v_6_1 = g.Except(a).ToArray();
var v_6_2 = g.Except(b).ToArray();
var v_6_3 = g.Except(c).ToArray();
//? Produktmenge
// Jedes Element von A mit B als Tupel
var v_7_1 = a.Join(b, x => x, y => y, (x, y) => new { x, y }, new LambdaEqualityComparer<int>((x, y) => true, (x) => 0)).ToArray();
var v_7_2 = a.Join(c, x => x, y => y, (x, y) => new { x, y }, new LambdaEqualityComparer<int>((x, y) => true, (x) => 0)).ToArray();
var v_7_3 = b.Join(c, x => x, y => y, (x, y) => new { x, y }, new LambdaEqualityComparer<int>((x, y) => true, (x) => 0)).ToArray();
var v_7_4 = b.Join(a, x => x, y => y, (x, y) => new { x, y }, new LambdaEqualityComparer<int>((x, y) => true, (x) => 0)).ToArray();
var v_7_5 = c.Join(a, x => x, y => y, (x, y) => new { x, y }, new LambdaEqualityComparer<int>((x, y) => true, (x) => 0)).ToArray();
var v_7_6 = c.Join(b, x => x, y => y, (x, y) => new { x, y }, new LambdaEqualityComparer<int>((x, y) => true, (x) => 0)).ToArray();
//? Sortieren
//! LINQ Liefert die Daten unsortiert zurück!
// Die Werte werden sortiert.
var v_8_1 = a.OrderBy(x => x);
var v_8_2 = b.OrderBy(x => x);
var v_8_3 = c.OrderBy(x => x);