[chore:] implemented symmetric difference (combiner) and its usage

This commit is contained in:
Elias Fierke
2025-10-23 20:49:19 +02:00
parent 34c4dd8df1
commit a2af60a808
3 changed files with 61 additions and 2 deletions

View File

@@ -23,6 +23,7 @@ public class CombineAddresses
if (type == "difference") return Difference(address_lists);
if (type == "union") return Union(address_lists);
if (type == "intersection") return Intersection(address_lists);
if (type == "symdiff") return SymmetricDifference(address_lists);
return null;
});
@@ -205,9 +206,56 @@ public class CombineAddresses
}
public async Task<KasAddressList> SymmetricDifference()
public async Task<KasAddressList> SymmetricDifference(List<KasAddressList> address_lists, Progress progress = null)
{
return null;
var result = new KasAddressList("symmetric_difference");
if (address_lists == null || address_lists.Count == 0)
return result;
var total = address_lists.Sum(l => l.KasPersons.Count);
var processed = 0;
// Wir sammeln alle Personen + zählen, wie oft sie vorkommen
var allPersons = new List<(KasPerson person, int count)>();
foreach (var list in address_lists)
foreach (var person in list.KasPersons)
{
// Prüfen, ob schon vorhanden
var existing = allPersons.FirstOrDefault(p => CompareAddresses(p.person, person));
if (existing.person != null)
{
// Falls schon drin → Vorkommen erhöhen
var index = allPersons.IndexOf(existing);
allPersons[index] = (existing.person, existing.count + 1);
}
else
{
// Neu hinzufügen
allPersons.Add((person, 1));
}
processed++;
var percent = processed / (double)total * 100;
var logMessage =
$"{percent:F1}%: Person mit {person.refsid} verarbeitet (Zwischengröße {allPersons.Count})";
if (progress != null)
{
if (Dispatcher.UIThread.CheckAccess())
progress.LogAction?.Invoke(logMessage);
else
Dispatcher.UIThread.Post(() => progress.LogAction?.Invoke(logMessage));
}
}
// Nur diejenigen übernehmen, die *genau einmal* vorkamen
foreach (var (person, count) in allPersons)
if (count == 1)
result.KasPersons.Add(person);
return result;
}