From 3f5246bf51f01864d121693241a67ce2fa10b2ae Mon Sep 17 00:00:00 2001 From: JakenVeina Date: Sun, 3 May 2026 02:19:59 -0500 Subject: [PATCH] Fixed that the cache-land dynamic `.Filter()` operator relied on limited mutation of an internal `Dictionary<,>` during enumeration, a behavior that is not supported on target frameworks older than .NET Core 3.0. Additional logic to copy the keys to iterate, before mutation, should now be injected for builds targeting such older frameworks. --- src/Directory.Build.targets | 4 ++++ src/DynamicData/Cache/Internal/Filter.Dynamic.cs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 1c239dc61..347ab888d 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -10,4 +10,8 @@ $(DefineConstants);NETSTANDARD;P_LINQ;SUPPORTS_BINDINGLIST;SUPPORTS_ASYNC_DISPOSABLE + + + $(DefineConstants);SUPPORTS_DICTIONARY_MUTATION_DURING_ENUMERATION + diff --git a/src/DynamicData/Cache/Internal/Filter.Dynamic.cs b/src/DynamicData/Cache/Internal/Filter.Dynamic.cs index 9727c04a3..350ae272b 100644 --- a/src/DynamicData/Cache/Internal/Filter.Dynamic.cs +++ b/src/DynamicData/Cache/Internal/Filter.Dynamic.cs @@ -378,7 +378,11 @@ private void OnSourceNext(IChangeSet upstreamChanges) private void ReFilter(TState predicateState) { + #if SUPPORTS_DICTIONARY_MUTATION_DURING_ENUMERATION foreach (var key in _itemStatesByKey.Keys) + #else + foreach (var key in _itemStatesByKey.Keys.ToArray()) + #endif { var itemState = _itemStatesByKey[key];