Feedback

C# - LINQ und mathematische Mengen

Veröffentlicht von am 9/14/2013
(1 Bewertungen)
Dank LINQ lassen sich viele Operationen, welche sich auf Mengen anwenden lassen, sehr einfach in .NET durchführen. Lediglich Die Potenzmenge lässt sich nicht nur über LINQ berechnen. Darum habe ich diese hier auch nicht mit aufgeführt.

Die meisten LINQ-Methoden haben mehrere Überladungen. Mit diesen kann man eigene Vergleichsalgorithmen angeben.

Dieses Snippet stellt Beispiele für die Operationen dar.

Hinweis: Für die Produktmenge verwende ich folgende KLasse:
http://dotnet-snippets.de/snippet/lambdaequalitycomparer-t/2762
Diese kann auch noch für andere Ergänzungen genutzt werden.
//? 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);

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!