From 612a55a0701890d6719a3a191094b957bca1df41 Mon Sep 17 00:00:00 2001 From: Elias Fierke Date: Mon, 3 Aug 2026 08:56:21 +0200 Subject: [PATCH] [chore:] speed improvements (address check finally using dictionaries) --- Tasks/AddressCheck.cs | 121 +++++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 48 deletions(-) diff --git a/Tasks/AddressCheck.cs b/Tasks/AddressCheck.cs index 676da6a..b1ae57e 100644 --- a/Tasks/AddressCheck.cs +++ b/Tasks/AddressCheck.cs @@ -58,6 +58,33 @@ public class AddressCheck await Task.Run(async () => { + + // Refsids, die mehrfach vorkommen + var doubledRefsids = adset.KasPersons + .Where(p => p.refsid > 0) + .GroupBy(p => p.refsid) + .Where(g => g.Count() > 1) + .ToDictionary(g => g.Key, g => true); + + // Adressen, die mehrfach vorkommen + var doubledAddresses = adset.KasPersons + .GroupBy(p => ( + p.name, + p.strasse, + p.vorname, + p.ort, + p.funktion, + p.funktion2, + p.funktionad, + p.abteilung, + p.name1, + p.name2, + p.name3, + p.name4, + p.name5)) + .Where(g => g.Count() > 1) + .ToDictionary(g => g.Key, g => true); + foreach (var person in adset.KasPersons) { var errors = new List(); @@ -155,46 +182,34 @@ public class AddressCheck } // Address-Component-Count - if (!string.IsNullOrWhiteSpace(person.strasse2)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.land)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.name1)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.name2)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.name3)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.name4)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.name5)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.funktion)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.funktion2)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.funktionad)) address_component_count++; - if (!string.IsNullOrWhiteSpace(person.abteilung)) address_component_count++; - - // Double-Refsid or DoubleAddresses - foreach (var person2 in adset.KasPersons) + // Double-Refsid + if (person.refsid > 0 && + doubledRefsids.ContainsKey(person.refsid)) { - if (adset.KasPersons.IndexOf(person) == adset.KasPersons.IndexOf(person2)) continue; - - if (person.refsid == person2.refsid) // trifft auf Patch-Addressen nicht zu - { - hasFaults = true; - warnings.Add(WarningTypes.DoubledRefsid); - } - - if (person.name == person2.name && - person.strasse == person2.strasse && - person.vorname == person2.vorname && - person.ort == person2.ort && - person.funktion == person2.funktion && - person.funktion2 == person2.funktion2 && - person.funktionad == person2.funktionad && - person.abteilung == person2.abteilung && - person.name1 == person2.name1 && - person.name2 == person2.name2 && - person.name3 == person2.name3 && - person.name4 == person2.name4 && - person.name5 == person2.name5) - { - hasFaults = true; - errors.Add(ErrorTypes.MayBeSameAddress); - } + hasFaults = true; + warnings.Add(WarningTypes.DoubledRefsid); + } + + // Double-Address + var addressKey = ( + person.name, + person.strasse, + person.vorname, + person.ort, + person.funktion, + person.funktion2, + person.funktionad, + person.abteilung, + person.name1, + person.name2, + person.name3, + person.name4, + person.name5); + + if (doubledAddresses.ContainsKey(addressKey)) + { + hasFaults = true; + errors.Add(ErrorTypes.MayBeSameAddress); } // Adressen-Länge @@ -216,16 +231,26 @@ public class AddressCheck } // Fortschritt aktualisieren - Interlocked.Increment(ref current); - var percent = current / (double)total * 100; - await Dispatcher.UIThread.InvokeAsync(() => - { - if (hasFaults) - _progress.AddToLog($"Person mit id {person.id} ist fehlerhaft", - Convert.ToInt32(percent).ToString()); + // Interlocked.Increment(ref current); + // var percent = current / (double)total * 100; + // await Dispatcher.UIThread.InvokeAsync(() => + // { + // if (hasFaults) + // _progress.AddToLog($"Person mit id {person.id} ist fehlerhaft", + // Convert.ToInt32(percent).ToString()); + // + // _progress.ChangePercentage(percent); + // }); + + var cd = Interlocked.Increment(ref current); - _progress.ChangePercentage(percent); - }); + if (cd % 10 == 0) + { + var percent = cd / (double)total * 100; + + await Dispatcher.UIThread.InvokeAsync(() => + _progress.ChangePercentage(percent)); + } } });