diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml
index 084e36c75..d9cc41a40 100644
--- a/.github/workflows/ci-build.yml
+++ b/.github/workflows/ci-build.yml
@@ -10,7 +10,7 @@ env:
jobs:
build:
- runs-on: windows-2022
+ runs-on: windows-latest
outputs:
nbgv: ${{ steps.nbgv.outputs.SemVer2 }}
steps:
@@ -21,14 +21,22 @@ jobs:
fetch-depth: 0
lfs: true
- - name: Setup .NET 6/7/8/9
- uses: actions/setup-dotnet@v5
+ - name: Setup .NET (With cache)
+ uses: actions/setup-dotnet@v5.0.1
with:
dotnet-version: |
6.0.x
7.0.x
8.0.x
9.0.x
+ 10.0.x
+ cache: true
+ cache-dependency-path: |
+ **/Directory.Packages.props
+ **/*.sln
+ **/*.csproj
+ **/global.json
+ **/nuget.config
- name: NBGV
id: nbgv
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 640ca85c6..8f24c80fd 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -10,7 +10,7 @@ env:
jobs:
release:
- runs-on: windows-2022
+ runs-on: windows-latest
environment:
name: release
outputs:
@@ -22,15 +22,23 @@ jobs:
with:
fetch-depth: 0
- - name: Setup .NET 6/7/8/9
- uses: actions/setup-dotnet@v5
+ - name: Setup .NET (With cache)
+ uses: actions/setup-dotnet@v5.0.1
with:
dotnet-version: |
6.0.x
7.0.x
8.0.x
9.0.x
-
+ 10.0.x
+ cache: true
+ cache-dependency-path: |
+ **/Directory.Packages.props
+ **/*.sln
+ **/*.csproj
+ **/global.json
+ **/nuget.config
+
- name: NBGV
id: nbgv
uses: dotnet/nbgv@master
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 2c30d84ff..7d002a3bb 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -3,7 +3,7 @@
true
- $(NoWarn);1591;1701;1702;1705;VSX1000
+ $(NoWarn);1591;1701;1702;1705;VSX1000;CA1510
AnyCPU
enable
latest
@@ -35,11 +35,6 @@
true
-
-
-
- Full
-
false
@@ -63,7 +58,7 @@
-
+
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index 633bd8afe..1c239dc61 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -3,47 +3,11 @@
$(AssemblyName) ($(TargetFramework))
-
- $(DefineConstants);WINDOWS_UWP;P_LINQ
-
-
$(DefineConstants);P_LINQ;SUPPORTS_BINDINGLIST
-
- $(DefineConstants);NETSTANDARD;PORTABLE;P_LINQ;SUPPORTS_BINDINGLIST
-
-
-
- $(DefineConstants);SUPPORTS_ASYNC_DISPOSABLE
-
-
-
- $(DefineConstants);NETCOREAPP;P_LINQ;SUPPORTS_BINDINGLIST;SUPPORTS_ASYNC_DISPOSABLE
-
-
-
- $(DefineConstants);SUPPORTS_ASYNC_DISPOSABLE
-
-
-
- $(DefineConstants);NETSTANDARD;PORTABLE;P_LINQ;SUPPORTS_BINDINGLIST;SUPPORTS_ASYNC_DISPOSABLE
-
-
-
- $(DefineConstants);NETSTANDARD;PORTABLE;P_LINQ;SUPPORTS_BINDINGLIST;SUPPORTS_ASYNC_DISPOSABLE
-
-
-
- $(DefineConstants);NETSTANDARD;PORTABLE;P_LINQ;SUPPORTS_BINDINGLIST;SUPPORTS_ASYNC_DISPOSABLE
-
-
-
- $(DefineConstants);NETSTANDARD;PORTABLE;P_LINQ;SUPPORTS_BINDINGLIST;SUPPORTS_ASYNC_DISPOSABLE
-
-
-
- $(DefineConstants);NETSTANDARD;PORTABLE;P_LINQ;SUPPORTS_BINDINGLIST;SUPPORTS_ASYNC_DISPOSABLE
+
+ $(DefineConstants);NETSTANDARD;P_LINQ;SUPPORTS_BINDINGLIST;SUPPORTS_ASYNC_DISPOSABLE
diff --git a/src/DynamicData.Tests/API/ApiApprovalTests.DynamicDataTests.DotNet9_0.verified.txt b/src/DynamicData.Tests/API/ApiApprovalTests.DynamicDataTests.DotNet9_0.verified.txt
index fba40fd20..613e3e9a6 100644
--- a/src/DynamicData.Tests/API/ApiApprovalTests.DynamicDataTests.DotNet9_0.verified.txt
+++ b/src/DynamicData.Tests/API/ApiApprovalTests.DynamicDataTests.DotNet9_0.verified.txt
@@ -309,8 +309,6 @@ namespace DynamicData.Binding
protected virtual void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string? propertyName = null) { }
protected virtual void SetAndRaise(ref T backingField, T newValue, [System.Runtime.CompilerServices.CallerMemberName] string? propertyName = null) { }
protected virtual void SetAndRaise(ref T backingField, T newValue, System.Collections.Generic.IEqualityComparer? comparer, [System.Runtime.CompilerServices.CallerMemberName] string? propertyName = null) { }
- [System.Obsolete("This never worked properly in the first place")]
- public System.IDisposable SuspendNotifications(bool invokePropertyChangeEventWhenDisposed = true) { }
}
public class BindingListAdaptor<[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] T> : DynamicData.IChangeSetAdaptor
where T : notnull
@@ -469,7 +467,7 @@ namespace DynamicData.Binding
public static bool operator !=(DynamicData.Binding.PropertyValue? left, DynamicData.Binding.PropertyValue? right) { }
public static bool operator ==(DynamicData.Binding.PropertyValue? left, DynamicData.Binding.PropertyValue? right) { }
}
- public struct SortAndBindOptions : System.IEquatable
+ public readonly struct SortAndBindOptions : System.IEquatable
{
public SortAndBindOptions() { }
public int InitialCapacity { get; init; }
@@ -1344,10 +1342,6 @@ namespace DynamicData
public static System.IObservable> FilterOnObservable(this System.IObservable> source, System.Func> filterFactory, System.TimeSpan? buffer = default, System.Reactive.Concurrency.IScheduler? scheduler = null)
where TObject : notnull
where TKey : notnull { }
- [System.Obsolete("Use AutoRefresh(), followed by Filter() instead")]
- public static System.IObservable> FilterOnProperty(this System.IObservable> source, System.Linq.Expressions.Expression> propertySelector, System.Func predicate, System.TimeSpan? propertyChangedThrottle = default, System.Reactive.Concurrency.IScheduler? scheduler = null)
- where TObject : System.ComponentModel.INotifyPropertyChanged
- where TKey : notnull { }
[System.Obsolete("This can cause unhandled exception issues so do not use")]
public static System.IObservable FinallySafe(this System.IObservable source, System.Action finallyAction) { }
public static System.IObservable> Flatten(this System.IObservable> source)
@@ -2528,7 +2522,6 @@ namespace DynamicData
public static System.IObservable> Xor(this System.IObservable> source, params System.IObservable>[] others)
where T : notnull { }
}
- public static class ObsoleteEx { }
public class PageContext : System.IEquatable>
{
public PageContext(DynamicData.Operators.IPageResponse Response, System.Collections.Generic.IComparer Comparer, DynamicData.SortAndPageOptions Options) { }
diff --git a/src/DynamicData.Tests/Cache/FilterOnPropertyFixture.cs b/src/DynamicData.Tests/Cache/FilterOnPropertyFixture.cs
deleted file mode 100644
index 0e7dc1fde..000000000
--- a/src/DynamicData.Tests/Cache/FilterOnPropertyFixture.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-using System.Linq;
-
-using DynamicData.Tests.Domain;
-
-using FluentAssertions;
-
-using Xunit;
-
-namespace DynamicData.Tests.Cache;
-
-public class FilterOnPropertyFixture
-{
- [Fact]
- public void ChangeAValueSoItIsStillInTheFilter()
- {
- var people = Enumerable.Range(1, 100).Select(i => new Person("Name" + i, i)).ToArray();
- using var stub = new FilterPropertyStub();
- stub.Source.AddOrUpdate(people);
-
- people[50].Age = 100;
-
- stub.Results.Messages.Count.Should().Be(2);
- stub.Results.Data.Count.Should().Be(82);
- }
-
- [Fact]
- public void ChangeAValueToMatchFilter()
- {
- var people = Enumerable.Range(1, 100).Select(i => new Person("Name" + i, i)).ToArray();
- using var stub = new FilterPropertyStub();
- stub.Source.AddOrUpdate(people);
-
- people[20].Age = 10;
-
- stub.Results.Messages.Count.Should().Be(2);
- stub.Results.Data.Count.Should().Be(81);
- }
-
- [Fact]
- public void ChangeAValueToNoLongerMatchFilter()
- {
- var people = Enumerable.Range(1, 100).Select(i => new Person("Name" + i, i)).ToArray();
- using var stub = new FilterPropertyStub();
- stub.Source.AddOrUpdate(people);
-
- people[10].Age = 20;
-
- stub.Results.Messages.Count.Should().Be(2);
- stub.Results.Data.Count.Should().Be(83);
- }
-
- [Fact]
- public void InitialValues()
- {
- var people = Enumerable.Range(1, 100).Select(i => new Person("Name" + i, i)).ToArray();
- using var stub = new FilterPropertyStub();
- stub.Source.AddOrUpdate(people);
-
- stub.Results.Messages.Count.Should().Be(1);
- stub.Results.Data.Count.Should().Be(82);
-
- stub.Results.Data.Items.Should().BeEquivalentTo(people.Skip(18));
- }
-
- private class FilterPropertyStub : IDisposable
- {
- public FilterPropertyStub() => Results = new ChangeSetAggregator(Source.Connect().FilterOnProperty(p => p.Age, p => p.Age > 18));
-
- public ChangeSetAggregator Results { get; }
-
- public ISourceCache Source { get; } = new SourceCache(p => p.Name);
-
- public void Dispose()
- {
- Source.Dispose();
- Results.Dispose();
- }
- }
-}
diff --git a/src/DynamicData.Tests/DynamicData.Tests.csproj b/src/DynamicData.Tests/DynamicData.Tests.csproj
index bb39a812d..4b9e28c65 100644
--- a/src/DynamicData.Tests/DynamicData.Tests.csproj
+++ b/src/DynamicData.Tests/DynamicData.Tests.csproj
@@ -1,4 +1,4 @@
-
+
net9.0
$(NoWarn);CS0618;CA1801;CA1812;CA1816;CA1062;CA1063;CS8767;CS8602;CS8618;IDE1006
@@ -11,7 +11,7 @@
-
+
diff --git a/src/DynamicData.sln b/src/DynamicData.sln
index 3a9e98982..e5ce72ac8 100644
--- a/src/DynamicData.sln
+++ b/src/DynamicData.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.0.31808.319
+# Visual Studio Version 18
+VisualStudioVersion = 18.1.11312.151 d18.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicData", "DynamicData\DynamicData.csproj", "{FE903921-6C55-40E3-9A16-4127ECACC12C}"
EndProject
@@ -12,7 +12,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".other", ".other", "{DFCC45
..\.github\workflows\ci-build.yml = ..\.github\workflows\ci-build.yml
Directory.Build.props = Directory.Build.props
Directory.Build.targets = Directory.Build.targets
- global.json = global.json
..\nuget.config = ..\nuget.config
..\README.md = ..\README.md
..\.github\workflows\release.yml = ..\.github\workflows\release.yml
diff --git a/src/DynamicData/Aggregation/AggregateEnumerator.cs b/src/DynamicData/Aggregation/AggregateEnumerator.cs
index 35e18f707..be9f93264 100644
--- a/src/DynamicData/Aggregation/AggregateEnumerator.cs
+++ b/src/DynamicData/Aggregation/AggregateEnumerator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/AggregateItem.cs b/src/DynamicData/Aggregation/AggregateItem.cs
index 45454d5a6..cef641f87 100644
--- a/src/DynamicData/Aggregation/AggregateItem.cs
+++ b/src/DynamicData/Aggregation/AggregateItem.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/AggregateType.cs b/src/DynamicData/Aggregation/AggregateType.cs
index 974b8a025..776d18949 100644
--- a/src/DynamicData/Aggregation/AggregateType.cs
+++ b/src/DynamicData/Aggregation/AggregateType.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/AggregationEx.cs b/src/DynamicData/Aggregation/AggregationEx.cs
index 55c031da4..c90e35520 100644
--- a/src/DynamicData/Aggregation/AggregationEx.cs
+++ b/src/DynamicData/Aggregation/AggregationEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/Avg.cs b/src/DynamicData/Aggregation/Avg.cs
index a7c9c6343..85bb3b160 100644
--- a/src/DynamicData/Aggregation/Avg.cs
+++ b/src/DynamicData/Aggregation/Avg.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/AvgEx.cs b/src/DynamicData/Aggregation/AvgEx.cs
index afbc30f90..f042bba71 100644
--- a/src/DynamicData/Aggregation/AvgEx.cs
+++ b/src/DynamicData/Aggregation/AvgEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/CountEx.cs b/src/DynamicData/Aggregation/CountEx.cs
index ffdb3bbcf..46a1f298b 100644
--- a/src/DynamicData/Aggregation/CountEx.cs
+++ b/src/DynamicData/Aggregation/CountEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/IAggregateChangeSet.cs b/src/DynamicData/Aggregation/IAggregateChangeSet.cs
index 34d2e936b..bd0b72e43 100644
--- a/src/DynamicData/Aggregation/IAggregateChangeSet.cs
+++ b/src/DynamicData/Aggregation/IAggregateChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -8,6 +8,4 @@ namespace DynamicData.Aggregation;
/// A change set which has been shaped for rapid online aggregations.
///
/// The type of the item.
-public interface IAggregateChangeSet : IEnumerable>
-{
-}
+public interface IAggregateChangeSet : IEnumerable>;
diff --git a/src/DynamicData/Aggregation/MaxEx.cs b/src/DynamicData/Aggregation/MaxEx.cs
index e09e09e45..beb4d6e10 100644
--- a/src/DynamicData/Aggregation/MaxEx.cs
+++ b/src/DynamicData/Aggregation/MaxEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/StdDev.cs b/src/DynamicData/Aggregation/StdDev.cs
index 2f9942a21..81932c8d9 100644
--- a/src/DynamicData/Aggregation/StdDev.cs
+++ b/src/DynamicData/Aggregation/StdDev.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/StdDevEx.cs b/src/DynamicData/Aggregation/StdDevEx.cs
index 54de3b9e4..30599f9ec 100644
--- a/src/DynamicData/Aggregation/StdDevEx.cs
+++ b/src/DynamicData/Aggregation/StdDevEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Aggregation/SumEx.cs b/src/DynamicData/Aggregation/SumEx.cs
index 71d8c4e61..6d3f59a9a 100644
--- a/src/DynamicData/Aggregation/SumEx.cs
+++ b/src/DynamicData/Aggregation/SumEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Alias/ObservableCacheAlias.cs b/src/DynamicData/Alias/ObservableCacheAlias.cs
index 767574761..e5204850f 100644
--- a/src/DynamicData/Alias/ObservableCacheAlias.cs
+++ b/src/DynamicData/Alias/ObservableCacheAlias.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Alias/ObservableListAlias.cs b/src/DynamicData/Alias/ObservableListAlias.cs
index 6eaaff295..ca7d9eb7b 100644
--- a/src/DynamicData/Alias/ObservableListAlias.cs
+++ b/src/DynamicData/Alias/ObservableListAlias.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Attributes.cs b/src/DynamicData/Attributes.cs
index 812d58dfc..dfb6a9e85 100644
--- a/src/DynamicData/Attributes.cs
+++ b/src/DynamicData/Attributes.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/AbstractNotifyPropertyChanged.cs b/src/DynamicData/Binding/AbstractNotifyPropertyChanged.cs
index 1972a6137..e24b07843 100644
--- a/src/DynamicData/Binding/AbstractNotifyPropertyChanged.cs
+++ b/src/DynamicData/Binding/AbstractNotifyPropertyChanged.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -19,16 +19,6 @@ public abstract class AbstractNotifyPropertyChanged : INotifyPropertyChanged
///
public event PropertyChangedEventHandler? PropertyChanged;
- ///
- /// Suspends notifications. When disposed, a reset notification is fired.
- ///
- /// If the property changed event should be invoked when disposed.
- /// A disposable to indicate to stop suspending the notifications.
- [Obsolete("This never worked properly in the first place")]
- [SuppressMessage("Design", "CA1822: Make static", Justification = "Backwards compatibility")]
- public IDisposable SuspendNotifications(bool invokePropertyChangeEventWhenDisposed = true) =>
- Disposable.Empty; // Removed code because it adds weight to the object
-
///
/// Invokes on property changed.
///
diff --git a/src/DynamicData/Binding/BindPaged.cs b/src/DynamicData/Binding/BindPaged.cs
index e021466ad..1cbe39d35 100644
--- a/src/DynamicData/Binding/BindPaged.cs
+++ b/src/DynamicData/Binding/BindPaged.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/BindVirtualized.cs b/src/DynamicData/Binding/BindVirtualized.cs
index a4c391515..37a3e1739 100644
--- a/src/DynamicData/Binding/BindVirtualized.cs
+++ b/src/DynamicData/Binding/BindVirtualized.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/BindingListAdaptor.cs b/src/DynamicData/Binding/BindingListAdaptor.cs
index 6789e6ea0..06cc41aff 100644
--- a/src/DynamicData/Binding/BindingListAdaptor.cs
+++ b/src/DynamicData/Binding/BindingListAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/BindingListEventsSuspender.cs b/src/DynamicData/Binding/BindingListEventsSuspender.cs
index 562c4b0ed..256d08fbe 100644
--- a/src/DynamicData/Binding/BindingListEventsSuspender.cs
+++ b/src/DynamicData/Binding/BindingListEventsSuspender.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/BindingListEx.cs b/src/DynamicData/Binding/BindingListEx.cs
index 6c84b5e1f..4161d5c6a 100644
--- a/src/DynamicData/Binding/BindingListEx.cs
+++ b/src/DynamicData/Binding/BindingListEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/BindingOptions.cs b/src/DynamicData/Binding/BindingOptions.cs
index 46c103401..eb2d30934 100644
--- a/src/DynamicData/Binding/BindingOptions.cs
+++ b/src/DynamicData/Binding/BindingOptions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/ExpressionBuilder.cs b/src/DynamicData/Binding/ExpressionBuilder.cs
index ff0ccbfb4..861a7c871 100644
--- a/src/DynamicData/Binding/ExpressionBuilder.cs
+++ b/src/DynamicData/Binding/ExpressionBuilder.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/IEvaluateAware.cs b/src/DynamicData/Binding/IEvaluateAware.cs
index b7b9a6fda..6f4ce4206 100644
--- a/src/DynamicData/Binding/IEvaluateAware.cs
+++ b/src/DynamicData/Binding/IEvaluateAware.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/IIndexAware.cs b/src/DynamicData/Binding/IIndexAware.cs
index f9a863fe9..dc3a8d825 100644
--- a/src/DynamicData/Binding/IIndexAware.cs
+++ b/src/DynamicData/Binding/IIndexAware.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/INotifyCollectionChangedSuspender.cs b/src/DynamicData/Binding/INotifyCollectionChangedSuspender.cs
index 8c1e57b95..d0a75cc81 100644
--- a/src/DynamicData/Binding/INotifyCollectionChangedSuspender.cs
+++ b/src/DynamicData/Binding/INotifyCollectionChangedSuspender.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/IObservableCollection.cs b/src/DynamicData/Binding/IObservableCollection.cs
index d5f0ab82c..4358877b5 100644
--- a/src/DynamicData/Binding/IObservableCollection.cs
+++ b/src/DynamicData/Binding/IObservableCollection.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/IObservableCollectionAdaptor.cs b/src/DynamicData/Binding/IObservableCollectionAdaptor.cs
index d2948495c..a8f2d420b 100644
--- a/src/DynamicData/Binding/IObservableCollectionAdaptor.cs
+++ b/src/DynamicData/Binding/IObservableCollectionAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/IObservableListEx.cs b/src/DynamicData/Binding/IObservableListEx.cs
index bfb943804..cf7d3a37a 100644
--- a/src/DynamicData/Binding/IObservableListEx.cs
+++ b/src/DynamicData/Binding/IObservableListEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -39,7 +39,7 @@ public static IObservable> BindToObservableList(thi
observableList = sourceList;
// Return a observable that will connect to the source so we can properly dispose when the pipeline ends.
- return Observable.Create>(observer => { return source.Finally(() => sourceList.Dispose()).SubscribeSafe(observer); });
+ return Observable.Create>(observer => source.Finally(() => sourceList.Dispose()).SubscribeSafe(observer));
}
///
@@ -71,7 +71,7 @@ public static IObservable> BindToObservableList>(observer => { return source.Do(changes => sourceList.Edit(editor => editor.Clone(changes.RemoveKey(editor)))).Finally(() => sourceList.Dispose()).SubscribeSafe(observer); });
+ return Observable.Create>(observer => source.Do(changes => sourceList.Edit(editor => editor.Clone(changes.RemoveKey(editor)))).Finally(() => sourceList.Dispose()).SubscribeSafe(observer));
}
///
@@ -143,7 +143,7 @@ public static IObservable> BindToObservableList<
/// The source change set.
/// The list needed to support refresh.
/// The down casted .
- private static IChangeSet RemoveKey(this IChangeSet changeSetWithKey, IExtendedList list)
+ private static ChangeSet RemoveKey(this IChangeSet changeSetWithKey, IExtendedList list)
where TObject : notnull
where TKey : notnull
{
diff --git a/src/DynamicData/Binding/ISortedObservableCollectionAdaptor.cs b/src/DynamicData/Binding/ISortedObservableCollectionAdaptor.cs
index eaa71fabd..4188c4ef0 100644
--- a/src/DynamicData/Binding/ISortedObservableCollectionAdaptor.cs
+++ b/src/DynamicData/Binding/ISortedObservableCollectionAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/NotifyPropertyChangedEx.cs b/src/DynamicData/Binding/NotifyPropertyChangedEx.cs
index 29fb6bf9d..3c3ac0924 100644
--- a/src/DynamicData/Binding/NotifyPropertyChangedEx.cs
+++ b/src/DynamicData/Binding/NotifyPropertyChangedEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -25,7 +25,7 @@ public static class NotifyPropertyChangedEx
{
source.ThrowArgumentNullExceptionIfNull(nameof(source));
- return Observable.FromEventPattern(handler => source.PropertyChanged += handler, handler => source.PropertyChanged -= handler).Where(x => propertiesToMonitor.Length == 0 || propertiesToMonitor.Contains(x.EventArgs.PropertyName)).Select(_ => source);
+ return Observable.FromEventPattern(handler => source.PropertyChanged += handler, handler => source.PropertyChanged -= handler).Where(x => propertiesToMonitor.Length == 0 || propertiesToMonitor.Contains(x.EventArgs.PropertyName!)).Select(_ => source);
}
///
diff --git a/src/DynamicData/Binding/Observable.cs b/src/DynamicData/Binding/Observable.cs
index 403d2849f..3e439d160 100644
--- a/src/DynamicData/Binding/Observable.cs
+++ b/src/DynamicData/Binding/Observable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/ObservableCollectionAdaptor.cs b/src/DynamicData/Binding/ObservableCollectionAdaptor.cs
index ace180b12..4715aba25 100644
--- a/src/DynamicData/Binding/ObservableCollectionAdaptor.cs
+++ b/src/DynamicData/Binding/ObservableCollectionAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/ObservableCollectionEx.cs b/src/DynamicData/Binding/ObservableCollectionEx.cs
index 4696f80af..9b181ddeb 100644
--- a/src/DynamicData/Binding/ObservableCollectionEx.cs
+++ b/src/DynamicData/Binding/ObservableCollectionEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/ObservableCollectionExtended.cs b/src/DynamicData/Binding/ObservableCollectionExtended.cs
index 399a818a2..f99d9b9b4 100644
--- a/src/DynamicData/Binding/ObservableCollectionExtended.cs
+++ b/src/DynamicData/Binding/ObservableCollectionExtended.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/ObservablePropertyFactory.cs b/src/DynamicData/Binding/ObservablePropertyFactory.cs
index 4def718ed..9b38e06a7 100644
--- a/src/DynamicData/Binding/ObservablePropertyFactory.cs
+++ b/src/DynamicData/Binding/ObservablePropertyFactory.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/ObservablePropertyFactoryCache.cs b/src/DynamicData/Binding/ObservablePropertyFactoryCache.cs
index 1c4676518..a9c9dfd93 100644
--- a/src/DynamicData/Binding/ObservablePropertyFactoryCache.cs
+++ b/src/DynamicData/Binding/ObservablePropertyFactoryCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/ObservablePropertyPart.cs b/src/DynamicData/Binding/ObservablePropertyPart.cs
index c2ffbf228..09b2a8da8 100644
--- a/src/DynamicData/Binding/ObservablePropertyPart.cs
+++ b/src/DynamicData/Binding/ObservablePropertyPart.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/PropertyValue.cs b/src/DynamicData/Binding/PropertyValue.cs
index 1a6c33513..1f782386f 100644
--- a/src/DynamicData/Binding/PropertyValue.cs
+++ b/src/DynamicData/Binding/PropertyValue.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/SortAndBind.cs b/src/DynamicData/Binding/SortAndBind.cs
index 01b30231f..80cddd3e2 100644
--- a/src/DynamicData/Binding/SortAndBind.cs
+++ b/src/DynamicData/Binding/SortAndBind.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -83,8 +83,7 @@ public SortAndBind(IObservable> source,
_cache.Clone(changes);
// the sort applicator will be null until the comparer change observable fires.
- if (sortApplicator is not null)
- sortApplicator.ProcessChanges(changes, index == 0);
+ sortApplicator?.ProcessChanges(changes, index == 0);
return changes;
})
diff --git a/src/DynamicData/Binding/SortAndBindOptions.cs b/src/DynamicData/Binding/SortAndBindOptions.cs
index 584b57e4a..bf93e8afe 100644
--- a/src/DynamicData/Binding/SortAndBindOptions.cs
+++ b/src/DynamicData/Binding/SortAndBindOptions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -9,7 +9,7 @@ namespace DynamicData.Binding;
///
/// Options for the sort and bind operator.
///
-public record struct SortAndBindOptions()
+public readonly record struct SortAndBindOptions()
{
///
/// The reset threshold ie the number of changes before a reset is fired.
@@ -32,10 +32,11 @@ public record struct SortAndBindOptions()
public int InitialCapacity { get; init; } = -1;
///
- /// Reset on first time load.
- ///
+ /// Reset on first time load.
+ ///
/// This is opt-in only and is only required for consumers who need to maintain
/// backwards compatibility will the former BindingOptions.ResetOnFirstTimeLoad.
+ ///
///
public bool ResetOnFirstTimeLoad { get; init; }
diff --git a/src/DynamicData/Binding/SortDirection.cs b/src/DynamicData/Binding/SortDirection.cs
index a3a90b44f..84313ab99 100644
--- a/src/DynamicData/Binding/SortDirection.cs
+++ b/src/DynamicData/Binding/SortDirection.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/SortExpression.cs b/src/DynamicData/Binding/SortExpression.cs
index 87ea7a49c..9ff365ad2 100644
--- a/src/DynamicData/Binding/SortExpression.cs
+++ b/src/DynamicData/Binding/SortExpression.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/SortExpressionComparer.cs b/src/DynamicData/Binding/SortExpressionComparer.cs
index 9edfb0364..14c7f94c4 100644
--- a/src/DynamicData/Binding/SortExpressionComparer.cs
+++ b/src/DynamicData/Binding/SortExpressionComparer.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -15,14 +15,14 @@ public class SortExpressionComparer : List>, IComparer
///
/// The expression.
/// A comparer in ascending order.
- public static SortExpressionComparer Ascending(Func expression) => new() { new(expression) };
+ public static SortExpressionComparer Ascending(Func expression) => [new(expression)];
///
/// Create an descending sort expression.
///
/// The expression.
/// A comparer in descending order.
- public static SortExpressionComparer Descending(Func expression) => new() { new(expression, SortDirection.Descending) };
+ public static SortExpressionComparer Descending(Func expression) => [new(expression, SortDirection.Descending)];
///
public int Compare(T? x, T? y)
diff --git a/src/DynamicData/Binding/SortedBindingListAdaptor.cs b/src/DynamicData/Binding/SortedBindingListAdaptor.cs
index d4c081f75..81956791a 100644
--- a/src/DynamicData/Binding/SortedBindingListAdaptor.cs
+++ b/src/DynamicData/Binding/SortedBindingListAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Binding/SortedObservableCollectionAdaptor.cs b/src/DynamicData/Binding/SortedObservableCollectionAdaptor.cs
index 4bdb6dcb6..21c4c3e0c 100644
--- a/src/DynamicData/Binding/SortedObservableCollectionAdaptor.cs
+++ b/src/DynamicData/Binding/SortedObservableCollectionAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/CacheChangeSetEx.cs b/src/DynamicData/Cache/CacheChangeSetEx.cs
index 5baca5d39..2d03df512 100644
--- a/src/DynamicData/Cache/CacheChangeSetEx.cs
+++ b/src/DynamicData/Cache/CacheChangeSetEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Change.cs b/src/DynamicData/Cache/Change.cs
index 3c67f9f73..494a5eb0e 100644
--- a/src/DynamicData/Cache/Change.cs
+++ b/src/DynamicData/Cache/Change.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ChangeAwareCache.cs b/src/DynamicData/Cache/ChangeAwareCache.cs
index 0ca242365..3230a9946 100644
--- a/src/DynamicData/Cache/ChangeAwareCache.cs
+++ b/src/DynamicData/Cache/ChangeAwareCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ChangeReason.cs b/src/DynamicData/Cache/ChangeReason.cs
index fcabac958..899295daa 100644
--- a/src/DynamicData/Cache/ChangeReason.cs
+++ b/src/DynamicData/Cache/ChangeReason.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ChangeSet.cs b/src/DynamicData/Cache/ChangeSet.cs
index 820addea3..01c65f5f9 100644
--- a/src/DynamicData/Cache/ChangeSet.cs
+++ b/src/DynamicData/Cache/ChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/DistinctChangeSet.cs b/src/DynamicData/Cache/DistinctChangeSet.cs
index 1717e8788..0edd202a9 100644
--- a/src/DynamicData/Cache/DistinctChangeSet.cs
+++ b/src/DynamicData/Cache/DistinctChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/GroupChangeSet.cs b/src/DynamicData/Cache/GroupChangeSet.cs
index f9a372e4b..43127e584 100644
--- a/src/DynamicData/Cache/GroupChangeSet.cs
+++ b/src/DynamicData/Cache/GroupChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ICache.cs b/src/DynamicData/Cache/ICache.cs
index c248dc184..b7335b4c3 100644
--- a/src/DynamicData/Cache/ICache.cs
+++ b/src/DynamicData/Cache/ICache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ICacheUpdater.cs b/src/DynamicData/Cache/ICacheUpdater.cs
index 851dc9264..aaeefc725 100644
--- a/src/DynamicData/Cache/ICacheUpdater.cs
+++ b/src/DynamicData/Cache/ICacheUpdater.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IChangeSet.cs b/src/DynamicData/Cache/IChangeSet.cs
index db98ec648..59301f394 100644
--- a/src/DynamicData/Cache/IChangeSet.cs
+++ b/src/DynamicData/Cache/IChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IChangeSetAdaptor.cs b/src/DynamicData/Cache/IChangeSetAdaptor.cs
index e404a5553..454395795 100644
--- a/src/DynamicData/Cache/IChangeSetAdaptor.cs
+++ b/src/DynamicData/Cache/IChangeSetAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IConnectableCache.cs b/src/DynamicData/Cache/IConnectableCache.cs
index e3c6a66be..7663c0e83 100644
--- a/src/DynamicData/Cache/IConnectableCache.cs
+++ b/src/DynamicData/Cache/IConnectableCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IDistinctChangeSet.cs b/src/DynamicData/Cache/IDistinctChangeSet.cs
index 7b0eb6dfb..1410ab6d8 100644
--- a/src/DynamicData/Cache/IDistinctChangeSet.cs
+++ b/src/DynamicData/Cache/IDistinctChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IGroup.cs b/src/DynamicData/Cache/IGroup.cs
index efbd54d0c..431b79c13 100644
--- a/src/DynamicData/Cache/IGroup.cs
+++ b/src/DynamicData/Cache/IGroup.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IGroupChangeSet.cs b/src/DynamicData/Cache/IGroupChangeSet.cs
index 9bf7c7b97..e9a9d1f29 100644
--- a/src/DynamicData/Cache/IGroupChangeSet.cs
+++ b/src/DynamicData/Cache/IGroupChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IGrouping.cs b/src/DynamicData/Cache/IGrouping.cs
index 330bfa375..b951ff715 100644
--- a/src/DynamicData/Cache/IGrouping.cs
+++ b/src/DynamicData/Cache/IGrouping.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IImmutableGroupChangeSet.cs b/src/DynamicData/Cache/IImmutableGroupChangeSet.cs
index de296f116..7cfdc789c 100644
--- a/src/DynamicData/Cache/IImmutableGroupChangeSet.cs
+++ b/src/DynamicData/Cache/IImmutableGroupChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IIntermediateCache.cs b/src/DynamicData/Cache/IIntermediateCache.cs
index 9f3d5ee89..7ca604be0 100644
--- a/src/DynamicData/Cache/IIntermediateCache.cs
+++ b/src/DynamicData/Cache/IIntermediateCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IKey.cs b/src/DynamicData/Cache/IKey.cs
index c09a51f6e..eb7b2e351 100644
--- a/src/DynamicData/Cache/IKey.cs
+++ b/src/DynamicData/Cache/IKey.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IKeyValue.cs b/src/DynamicData/Cache/IKeyValue.cs
index f10c020b3..9782c0001 100644
--- a/src/DynamicData/Cache/IKeyValue.cs
+++ b/src/DynamicData/Cache/IKeyValue.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IKeyValueCollection.cs b/src/DynamicData/Cache/IKeyValueCollection.cs
index 01a55bb5e..41314fc55 100644
--- a/src/DynamicData/Cache/IKeyValueCollection.cs
+++ b/src/DynamicData/Cache/IKeyValueCollection.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IObservableCache.cs b/src/DynamicData/Cache/IObservableCache.cs
index 1ed3add5c..8897962a6 100644
--- a/src/DynamicData/Cache/IObservableCache.cs
+++ b/src/DynamicData/Cache/IObservableCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IPageRequest.cs b/src/DynamicData/Cache/IPageRequest.cs
index 478ef268e..4d5b06956 100644
--- a/src/DynamicData/Cache/IPageRequest.cs
+++ b/src/DynamicData/Cache/IPageRequest.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IPageResponse.cs b/src/DynamicData/Cache/IPageResponse.cs
index 96c4e0697..c92011c3d 100644
--- a/src/DynamicData/Cache/IPageResponse.cs
+++ b/src/DynamicData/Cache/IPageResponse.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IPagedChangeSet.cs b/src/DynamicData/Cache/IPagedChangeSet.cs
index 25fa75e17..4fd88a798 100644
--- a/src/DynamicData/Cache/IPagedChangeSet.cs
+++ b/src/DynamicData/Cache/IPagedChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IQuery.cs b/src/DynamicData/Cache/IQuery.cs
index 4d370bbfe..4f071c272 100644
--- a/src/DynamicData/Cache/IQuery.cs
+++ b/src/DynamicData/Cache/IQuery.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ISortedChangeSet.cs b/src/DynamicData/Cache/ISortedChangeSet.cs
index 5e992ccec..8379f4992 100644
--- a/src/DynamicData/Cache/ISortedChangeSet.cs
+++ b/src/DynamicData/Cache/ISortedChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ISortedChangeSetAdaptor.cs b/src/DynamicData/Cache/ISortedChangeSetAdaptor.cs
index faa41b084..0e904cf22 100644
--- a/src/DynamicData/Cache/ISortedChangeSetAdaptor.cs
+++ b/src/DynamicData/Cache/ISortedChangeSetAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ISourceCache.cs b/src/DynamicData/Cache/ISourceCache.cs
index c2755ffeb..a24d693ed 100644
--- a/src/DynamicData/Cache/ISourceCache.cs
+++ b/src/DynamicData/Cache/ISourceCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ISourceUpdater.cs b/src/DynamicData/Cache/ISourceUpdater.cs
index e6ad820ad..10eb71f22 100644
--- a/src/DynamicData/Cache/ISourceUpdater.cs
+++ b/src/DynamicData/Cache/ISourceUpdater.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IVirtualChangeSet.cs b/src/DynamicData/Cache/IVirtualChangeSet.cs
index 3f2aee7d6..4c86cbce7 100644
--- a/src/DynamicData/Cache/IVirtualChangeSet.cs
+++ b/src/DynamicData/Cache/IVirtualChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IVirtualRequest.cs b/src/DynamicData/Cache/IVirtualRequest.cs
index 2d8d612d8..cdbee1ee5 100644
--- a/src/DynamicData/Cache/IVirtualRequest.cs
+++ b/src/DynamicData/Cache/IVirtualRequest.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IVirtualResponse.cs b/src/DynamicData/Cache/IVirtualResponse.cs
index 85c84cc32..616e2fb11 100644
--- a/src/DynamicData/Cache/IVirtualResponse.cs
+++ b/src/DynamicData/Cache/IVirtualResponse.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IndexedItem.cs b/src/DynamicData/Cache/IndexedItem.cs
index bd1708d15..7b5c77511 100644
--- a/src/DynamicData/Cache/IndexedItem.cs
+++ b/src/DynamicData/Cache/IndexedItem.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/IntermediateCache.cs b/src/DynamicData/Cache/IntermediateCache.cs
index 74cce3c7e..4494449a5 100644
--- a/src/DynamicData/Cache/IntermediateCache.cs
+++ b/src/DynamicData/Cache/IntermediateCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/AbstractFilter.cs b/src/DynamicData/Cache/Internal/AbstractFilter.cs
index f0e102eb9..5e86dd997 100644
--- a/src/DynamicData/Cache/Internal/AbstractFilter.cs
+++ b/src/DynamicData/Cache/Internal/AbstractFilter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/AnonymousObservableCache.cs b/src/DynamicData/Cache/Internal/AnonymousObservableCache.cs
index 2f46411b0..be5e8d189 100644
--- a/src/DynamicData/Cache/Internal/AnonymousObservableCache.cs
+++ b/src/DynamicData/Cache/Internal/AnonymousObservableCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/AnonymousQuery.cs b/src/DynamicData/Cache/Internal/AnonymousQuery.cs
index 247af24c5..f83fd2018 100644
--- a/src/DynamicData/Cache/Internal/AnonymousQuery.cs
+++ b/src/DynamicData/Cache/Internal/AnonymousQuery.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/AsyncDisposeMany.cs b/src/DynamicData/Cache/Internal/AsyncDisposeMany.cs
index c4d28265d..a134360c5 100644
--- a/src/DynamicData/Cache/Internal/AsyncDisposeMany.cs
+++ b/src/DynamicData/Cache/Internal/AsyncDisposeMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/AutoRefresh.cs b/src/DynamicData/Cache/Internal/AutoRefresh.cs
index 2288fa849..d489a56dc 100644
--- a/src/DynamicData/Cache/Internal/AutoRefresh.cs
+++ b/src/DynamicData/Cache/Internal/AutoRefresh.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/BatchIf.cs b/src/DynamicData/Cache/Internal/BatchIf.cs
index 1522b2869..17d5e4a3a 100644
--- a/src/DynamicData/Cache/Internal/BatchIf.cs
+++ b/src/DynamicData/Cache/Internal/BatchIf.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/Cache.cs b/src/DynamicData/Cache/Internal/Cache.cs
index 3c43c40b6..0a882ad88 100644
--- a/src/DynamicData/Cache/Internal/Cache.cs
+++ b/src/DynamicData/Cache/Internal/Cache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/CacheEx.cs b/src/DynamicData/Cache/Internal/CacheEx.cs
index a80f9bd41..8250f168e 100644
--- a/src/DynamicData/Cache/Internal/CacheEx.cs
+++ b/src/DynamicData/Cache/Internal/CacheEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/CacheUpdater.cs b/src/DynamicData/Cache/Internal/CacheUpdater.cs
index 103d8bee2..8eb6eadf8 100644
--- a/src/DynamicData/Cache/Internal/CacheUpdater.cs
+++ b/src/DynamicData/Cache/Internal/CacheUpdater.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/Cast.cs b/src/DynamicData/Cache/Internal/Cast.cs
index cf3da7743..02f62ebb8 100644
--- a/src/DynamicData/Cache/Internal/Cast.cs
+++ b/src/DynamicData/Cache/Internal/Cast.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ChangeSetCache.cs b/src/DynamicData/Cache/Internal/ChangeSetCache.cs
index f14ba57f4..d63a93bea 100644
--- a/src/DynamicData/Cache/Internal/ChangeSetCache.cs
+++ b/src/DynamicData/Cache/Internal/ChangeSetCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ChangeSetMergeTracker.cs b/src/DynamicData/Cache/Internal/ChangeSetMergeTracker.cs
index 47360ed68..ae973094e 100644
--- a/src/DynamicData/Cache/Internal/ChangeSetMergeTracker.cs
+++ b/src/DynamicData/Cache/Internal/ChangeSetMergeTracker.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/CombineOperator.cs b/src/DynamicData/Cache/Internal/CombineOperator.cs
index 30a7fb0df..9bba3dd38 100644
--- a/src/DynamicData/Cache/Internal/CombineOperator.cs
+++ b/src/DynamicData/Cache/Internal/CombineOperator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/Combiner.cs b/src/DynamicData/Cache/Internal/Combiner.cs
index 6f285c3d5..c7734512d 100644
--- a/src/DynamicData/Cache/Internal/Combiner.cs
+++ b/src/DynamicData/Cache/Internal/Combiner.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -21,7 +21,7 @@ internal sealed class Combiner(CombineOperator type, Action> _sourceCaches = new List>();
+ private readonly IList> _sourceCaches = [];
public IDisposable Subscribe(IObservable>[] source)
{
@@ -75,7 +75,7 @@ private bool MatchesConstraint(TKey key)
private void Update(Cache cache, IChangeSet updates)
{
- IChangeSet notifications;
+ ChangeSet notifications;
lock (_locker)
{
diff --git a/src/DynamicData/Cache/Internal/DeferUntilLoaded.cs b/src/DynamicData/Cache/Internal/DeferUntilLoaded.cs
index 0dc1a0721..0402b7b5f 100644
--- a/src/DynamicData/Cache/Internal/DeferUntilLoaded.cs
+++ b/src/DynamicData/Cache/Internal/DeferUntilLoaded.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/DictionaryExtensions.cs b/src/DynamicData/Cache/Internal/DictionaryExtensions.cs
index 651733ff4..d8d9f27ea 100644
--- a/src/DynamicData/Cache/Internal/DictionaryExtensions.cs
+++ b/src/DynamicData/Cache/Internal/DictionaryExtensions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -7,5 +7,5 @@ namespace DynamicData.Cache.Internal;
internal static class DictionaryExtensions
{
internal static IEnumerable GetOrEmpty(this IDictionary> dict, TDictKey key) =>
- dict.TryGetValue(key, out var value) ? value : Enumerable.Empty();
+ dict.TryGetValue(key, out var value) ? value : [];
}
diff --git a/src/DynamicData/Cache/Internal/DisposeMany.cs b/src/DynamicData/Cache/Internal/DisposeMany.cs
index fb8a9cd04..7271896c8 100644
--- a/src/DynamicData/Cache/Internal/DisposeMany.cs
+++ b/src/DynamicData/Cache/Internal/DisposeMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/DistinctCalculator.cs b/src/DynamicData/Cache/Internal/DistinctCalculator.cs
index 06e36f8fc..934f17ac3 100644
--- a/src/DynamicData/Cache/Internal/DistinctCalculator.cs
+++ b/src/DynamicData/Cache/Internal/DistinctCalculator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/DynamicCombiner.cs b/src/DynamicData/Cache/Internal/DynamicCombiner.cs
index 30ed7b2cb..a5eba2bdd 100644
--- a/src/DynamicData/Cache/Internal/DynamicCombiner.cs
+++ b/src/DynamicData/Cache/Internal/DynamicCombiner.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/DynamicFilter.cs b/src/DynamicData/Cache/Internal/DynamicFilter.cs
index f38526081..86f3aced3 100644
--- a/src/DynamicData/Cache/Internal/DynamicFilter.cs
+++ b/src/DynamicData/Cache/Internal/DynamicFilter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/DynamicGrouper.cs b/src/DynamicData/Cache/Internal/DynamicGrouper.cs
index 47c7f5c3b..cb4880193 100644
--- a/src/DynamicData/Cache/Internal/DynamicGrouper.cs
+++ b/src/DynamicData/Cache/Internal/DynamicGrouper.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/EditDiff.cs b/src/DynamicData/Cache/Internal/EditDiff.cs
index fecdc3dd1..ba6679d03 100644
--- a/src/DynamicData/Cache/Internal/EditDiff.cs
+++ b/src/DynamicData/Cache/Internal/EditDiff.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/EditDiffChangeSet.cs b/src/DynamicData/Cache/Internal/EditDiffChangeSet.cs
index c7150073c..b363a9505 100644
--- a/src/DynamicData/Cache/Internal/EditDiffChangeSet.cs
+++ b/src/DynamicData/Cache/Internal/EditDiffChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/EditDiffChangeSetOptional.cs b/src/DynamicData/Cache/Internal/EditDiffChangeSetOptional.cs
index d68385ec1..f65df1b96 100644
--- a/src/DynamicData/Cache/Internal/EditDiffChangeSetOptional.cs
+++ b/src/DynamicData/Cache/Internal/EditDiffChangeSetOptional.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ExpirableItem.cs b/src/DynamicData/Cache/Internal/ExpirableItem.cs
index f2d0aef51..ab02ac3d1 100644
--- a/src/DynamicData/Cache/Internal/ExpirableItem.cs
+++ b/src/DynamicData/Cache/Internal/ExpirableItem.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ExpireAfter.ForSource.cs b/src/DynamicData/Cache/Internal/ExpireAfter.ForSource.cs
index 6f7d72350..cf3e317ec 100644
--- a/src/DynamicData/Cache/Internal/ExpireAfter.ForSource.cs
+++ b/src/DynamicData/Cache/Internal/ExpireAfter.ForSource.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -69,9 +69,9 @@ protected SubscriptionBase(
_onEditingSource = OnEditingSource;
- _expirationDueTimesByKey = new();
- _proposedExpirationsQueue = new();
- _removedItemsBuffer = new();
+ _expirationDueTimesByKey = [];
+ _proposedExpirationsQueue = [];
+ _removedItemsBuffer = [];
_sourceSubscription = source
.Connect()
@@ -350,22 +350,17 @@ private readonly struct ScheduledManagement
}
}
- private sealed class OnDemandSubscription
- : SubscriptionBase
+ private sealed class OnDemandSubscription(
+ IObserver>> observer,
+ IScheduler? scheduler,
+ ISourceCache source,
+ Func timeSelector)
+ : SubscriptionBase(
+ observer,
+ scheduler,
+ source,
+ timeSelector)
{
- public OnDemandSubscription(
- IObserver>> observer,
- IScheduler? scheduler,
- ISourceCache source,
- Func timeSelector)
- : base(
- observer,
- scheduler,
- source,
- timeSelector)
- {
- }
-
protected override DateTimeOffset? GetNextManagementDueTime()
=> GetNextProposedExpirationDueTime();
diff --git a/src/DynamicData/Cache/Internal/ExpireAfter.ForStream.cs b/src/DynamicData/Cache/Internal/ExpireAfter.ForStream.cs
index 5b09bae6c..d128ada8f 100644
--- a/src/DynamicData/Cache/Internal/ExpireAfter.ForStream.cs
+++ b/src/DynamicData/Cache/Internal/ExpireAfter.ForStream.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -64,9 +64,9 @@ protected SubscriptionBase(
_scheduler = scheduler ?? GlobalConfig.DefaultScheduler;
- _expirationDueTimesByKey = new();
+ _expirationDueTimesByKey = [];
_itemsCache = new();
- _proposedExpirationsQueue = new();
+ _proposedExpirationsQueue = [];
_sourceSubscription = source
.Synchronize(SynchronizationGate)
@@ -346,22 +346,17 @@ private readonly struct ScheduledManagement
}
}
- private sealed class OnDemandSubscription
- : SubscriptionBase
+ private sealed class OnDemandSubscription(
+ IObserver> observer,
+ IScheduler? scheduler,
+ IObservable> source,
+ Func timeSelector)
+ : SubscriptionBase(
+ observer,
+ scheduler,
+ source,
+ timeSelector)
{
- public OnDemandSubscription(
- IObserver> observer,
- IScheduler? scheduler,
- IObservable> source,
- Func timeSelector)
- : base(
- observer,
- scheduler,
- source,
- timeSelector)
- {
- }
-
protected override DateTimeOffset? GetNextManagementDueTime()
=> GetNextProposedExpirationDueTime();
diff --git a/src/DynamicData/Cache/Internal/Filter.WithPredicateState.cs b/src/DynamicData/Cache/Internal/Filter.WithPredicateState.cs
index 4c465039a..64a49c03d 100644
--- a/src/DynamicData/Cache/Internal/Filter.WithPredicateState.cs
+++ b/src/DynamicData/Cache/Internal/Filter.WithPredicateState.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -58,8 +58,8 @@ public Subscription(
_predicate = predicate;
_suppressEmptyChangeSets = suppressEmptyChangeSets;
- _downstreamChangesBuffer = new();
- _itemStatesByKey = new();
+ _downstreamChangesBuffer = [];
+ _itemStatesByKey = [];
_latestPredicateState = default!;
@@ -90,7 +90,7 @@ private object DownstreamSynchronizationGate
private object UpstreamSynchronizationGate
=> _itemStatesByKey;
- private IChangeSet AssembleDownstreamChanges()
+ private ChangeSet AssembleDownstreamChanges()
{
if (_downstreamChangesBuffer.Count is 0)
return ChangeSet.Empty;
diff --git a/src/DynamicData/Cache/Internal/FilterEx.cs b/src/DynamicData/Cache/Internal/FilterEx.cs
index 6587fa1d4..f21c493e9 100644
--- a/src/DynamicData/Cache/Internal/FilterEx.cs
+++ b/src/DynamicData/Cache/Internal/FilterEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/FilterImmutable.cs b/src/DynamicData/Cache/Internal/FilterImmutable.cs
index 1fa57d033..f257b18a1 100644
--- a/src/DynamicData/Cache/Internal/FilterImmutable.cs
+++ b/src/DynamicData/Cache/Internal/FilterImmutable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/FilterOnObservable.cs b/src/DynamicData/Cache/Internal/FilterOnObservable.cs
index ec2b77198..d444d9ac4 100644
--- a/src/DynamicData/Cache/Internal/FilterOnObservable.cs
+++ b/src/DynamicData/Cache/Internal/FilterOnObservable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/FilterOnProperty.cs b/src/DynamicData/Cache/Internal/FilterOnProperty.cs
deleted file mode 100644
index 7bb9e7653..000000000
--- a/src/DynamicData/Cache/Internal/FilterOnProperty.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
-// Roland Pheasant licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for full license information.
-
-using System.ComponentModel;
-using System.Linq.Expressions;
-using System.Reactive.Concurrency;
-
-namespace DynamicData.Cache.Internal;
-
-[Obsolete("Use AutoRefresh(), followed by Filter() instead")]
-internal sealed class FilterOnProperty(IObservable> source, Expression> propertySelector, Func predicate, TimeSpan? throttle = null, IScheduler? scheduler = null)
- where TObject : INotifyPropertyChanged
- where TKey : notnull
-{
- public IObservable> Run() => source.AutoRefresh(propertySelector, propertyChangeThrottle: throttle, scheduler: scheduler).Filter(predicate);
-}
diff --git a/src/DynamicData/Cache/Internal/FilteredIndexCalculator.cs b/src/DynamicData/Cache/Internal/FilteredIndexCalculator.cs
index 62ab0f192..c8ed437e0 100644
--- a/src/DynamicData/Cache/Internal/FilteredIndexCalculator.cs
+++ b/src/DynamicData/Cache/Internal/FilteredIndexCalculator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -16,7 +16,7 @@ public static IList> Calculate(IKeyValueCollection new Change(ChangeReason.Remove, item.Key, item.Value, index));
var newItems = currentItems.Select((item, index) => new Change(ChangeReason.Add, item.Key, item.Value, index));
- return new List>(removed.Union(newItems));
+ return [.. removed.Union(newItems)];
}
var previousList = previousItems.ToList();
@@ -130,7 +130,7 @@ public static IList> Calculate(IKeyValueCollection> list, KeyValuePair item, IComparer> comparer)
+ private static int GetInsertPositionLinear(List> list, KeyValuePair item, IComparer> comparer)
{
for (var i = 0; i < list.Count; i++)
{
diff --git a/src/DynamicData/Cache/Internal/FinallySafe.cs b/src/DynamicData/Cache/Internal/FinallySafe.cs
index bb19e6cdf..d4cb04523 100644
--- a/src/DynamicData/Cache/Internal/FinallySafe.cs
+++ b/src/DynamicData/Cache/Internal/FinallySafe.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/FullJoin.cs b/src/DynamicData/Cache/Internal/FullJoin.cs
index 3a370d2a1..f4e4f5438 100644
--- a/src/DynamicData/Cache/Internal/FullJoin.cs
+++ b/src/DynamicData/Cache/Internal/FullJoin.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/FullJoinMany.cs b/src/DynamicData/Cache/Internal/FullJoinMany.cs
index 63b7293b3..28ae5a008 100644
--- a/src/DynamicData/Cache/Internal/FullJoinMany.cs
+++ b/src/DynamicData/Cache/Internal/FullJoinMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/GroupOn.cs b/src/DynamicData/Cache/Internal/GroupOn.cs
index 2ab6b472e..619685afd 100644
--- a/src/DynamicData/Cache/Internal/GroupOn.cs
+++ b/src/DynamicData/Cache/Internal/GroupOn.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/GroupOnDynamic.cs b/src/DynamicData/Cache/Internal/GroupOnDynamic.cs
index 8cefab3fa..815baa34d 100644
--- a/src/DynamicData/Cache/Internal/GroupOnDynamic.cs
+++ b/src/DynamicData/Cache/Internal/GroupOnDynamic.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/GroupOnImmutable.cs b/src/DynamicData/Cache/Internal/GroupOnImmutable.cs
index 283590783..a7a14e3e2 100644
--- a/src/DynamicData/Cache/Internal/GroupOnImmutable.cs
+++ b/src/DynamicData/Cache/Internal/GroupOnImmutable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/GroupOnObservable.cs b/src/DynamicData/Cache/Internal/GroupOnObservable.cs
index cf36cfd54..0555004e1 100644
--- a/src/DynamicData/Cache/Internal/GroupOnObservable.cs
+++ b/src/DynamicData/Cache/Internal/GroupOnObservable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/GroupOnProperty.cs b/src/DynamicData/Cache/Internal/GroupOnProperty.cs
index 45d1fcc30..8fa06893b 100644
--- a/src/DynamicData/Cache/Internal/GroupOnProperty.cs
+++ b/src/DynamicData/Cache/Internal/GroupOnProperty.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/GroupOnPropertyWithImmutableState.cs b/src/DynamicData/Cache/Internal/GroupOnPropertyWithImmutableState.cs
index 08021f5ee..bc3755a44 100644
--- a/src/DynamicData/Cache/Internal/GroupOnPropertyWithImmutableState.cs
+++ b/src/DynamicData/Cache/Internal/GroupOnPropertyWithImmutableState.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/IFilter.cs b/src/DynamicData/Cache/Internal/IFilter.cs
index 1924a226b..6301a0cfa 100644
--- a/src/DynamicData/Cache/Internal/IFilter.cs
+++ b/src/DynamicData/Cache/Internal/IFilter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/IKeySelector.cs b/src/DynamicData/Cache/Internal/IKeySelector.cs
index 6df8e15e0..71c6e5aa9 100644
--- a/src/DynamicData/Cache/Internal/IKeySelector.cs
+++ b/src/DynamicData/Cache/Internal/IKeySelector.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ImmutableGroup.cs b/src/DynamicData/Cache/Internal/ImmutableGroup.cs
index e4d7557a6..82ffaae3d 100644
--- a/src/DynamicData/Cache/Internal/ImmutableGroup.cs
+++ b/src/DynamicData/Cache/Internal/ImmutableGroup.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ImmutableGroupChangeSet.cs b/src/DynamicData/Cache/Internal/ImmutableGroupChangeSet.cs
index 8a0f9e194..81ebbc290 100644
--- a/src/DynamicData/Cache/Internal/ImmutableGroupChangeSet.cs
+++ b/src/DynamicData/Cache/Internal/ImmutableGroupChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/IndexAndNode.cs b/src/DynamicData/Cache/Internal/IndexAndNode.cs
index ca24d3ff3..d80b66fd9 100644
--- a/src/DynamicData/Cache/Internal/IndexAndNode.cs
+++ b/src/DynamicData/Cache/Internal/IndexAndNode.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/IndexCalculator.cs b/src/DynamicData/Cache/Internal/IndexCalculator.cs
index 8bf7b70b3..709245408 100644
--- a/src/DynamicData/Cache/Internal/IndexCalculator.cs
+++ b/src/DynamicData/Cache/Internal/IndexCalculator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -232,7 +232,7 @@ private int GetInsertPositionBinary(KeyValuePair item)
return ~index;
}
- private int GetInsertPositionLinear(IList> list, KeyValuePair item)
+ private int GetInsertPositionLinear(List> list, KeyValuePair item)
{
for (var i = 0; i < list.Count; i++)
{
diff --git a/src/DynamicData/Cache/Internal/InnerJoin.cs b/src/DynamicData/Cache/Internal/InnerJoin.cs
index 23752cb06..ae9858e74 100644
--- a/src/DynamicData/Cache/Internal/InnerJoin.cs
+++ b/src/DynamicData/Cache/Internal/InnerJoin.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/InnerJoinMany.cs b/src/DynamicData/Cache/Internal/InnerJoinMany.cs
index 578e071b8..dcec95d86 100644
--- a/src/DynamicData/Cache/Internal/InnerJoinMany.cs
+++ b/src/DynamicData/Cache/Internal/InnerJoinMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/KeyComparer.cs b/src/DynamicData/Cache/Internal/KeyComparer.cs
index 58e268209..6cc831558 100644
--- a/src/DynamicData/Cache/Internal/KeyComparer.cs
+++ b/src/DynamicData/Cache/Internal/KeyComparer.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/KeySelector.cs b/src/DynamicData/Cache/Internal/KeySelector.cs
index 1c642664b..87127dfcb 100644
--- a/src/DynamicData/Cache/Internal/KeySelector.cs
+++ b/src/DynamicData/Cache/Internal/KeySelector.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/KeySelectorException.cs b/src/DynamicData/Cache/Internal/KeySelectorException.cs
index 6d4f46954..5a5fe737b 100644
--- a/src/DynamicData/Cache/Internal/KeySelectorException.cs
+++ b/src/DynamicData/Cache/Internal/KeySelectorException.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/KeyValueCollection.cs b/src/DynamicData/Cache/Internal/KeyValueCollection.cs
index 414e00367..d743073f5 100644
--- a/src/DynamicData/Cache/Internal/KeyValueCollection.cs
+++ b/src/DynamicData/Cache/Internal/KeyValueCollection.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/KeyValueComparer.cs b/src/DynamicData/Cache/Internal/KeyValueComparer.cs
index fe47051c2..b9f3face6 100644
--- a/src/DynamicData/Cache/Internal/KeyValueComparer.cs
+++ b/src/DynamicData/Cache/Internal/KeyValueComparer.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/LeftJoin.cs b/src/DynamicData/Cache/Internal/LeftJoin.cs
index 5ab305ba0..bcacf8774 100644
--- a/src/DynamicData/Cache/Internal/LeftJoin.cs
+++ b/src/DynamicData/Cache/Internal/LeftJoin.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/LeftJoinMany.cs b/src/DynamicData/Cache/Internal/LeftJoinMany.cs
index 19ea0c7f0..8ce0b1f06 100644
--- a/src/DynamicData/Cache/Internal/LeftJoinMany.cs
+++ b/src/DynamicData/Cache/Internal/LeftJoinMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/LockFreeObservableCache.cs b/src/DynamicData/Cache/Internal/LockFreeObservableCache.cs
index c069b5913..be539b82c 100644
--- a/src/DynamicData/Cache/Internal/LockFreeObservableCache.cs
+++ b/src/DynamicData/Cache/Internal/LockFreeObservableCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ManagedGroup.cs b/src/DynamicData/Cache/Internal/ManagedGroup.cs
index 85836d252..02d3583fa 100644
--- a/src/DynamicData/Cache/Internal/ManagedGroup.cs
+++ b/src/DynamicData/Cache/Internal/ManagedGroup.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/MergeChangeSets.cs b/src/DynamicData/Cache/Internal/MergeChangeSets.cs
index c55c60d3e..62b942402 100644
--- a/src/DynamicData/Cache/Internal/MergeChangeSets.cs
+++ b/src/DynamicData/Cache/Internal/MergeChangeSets.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/MergeMany.cs b/src/DynamicData/Cache/Internal/MergeMany.cs
index 1cb6fd546..0058ffe55 100644
--- a/src/DynamicData/Cache/Internal/MergeMany.cs
+++ b/src/DynamicData/Cache/Internal/MergeMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/MergeManyCacheChangeSets.cs b/src/DynamicData/Cache/Internal/MergeManyCacheChangeSets.cs
index 56ae6a07f..551cc8bbf 100644
--- a/src/DynamicData/Cache/Internal/MergeManyCacheChangeSets.cs
+++ b/src/DynamicData/Cache/Internal/MergeManyCacheChangeSets.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/MergeManyCacheChangeSetsSourceCompare.cs b/src/DynamicData/Cache/Internal/MergeManyCacheChangeSetsSourceCompare.cs
index 754dcd929..a49ad8223 100644
--- a/src/DynamicData/Cache/Internal/MergeManyCacheChangeSetsSourceCompare.cs
+++ b/src/DynamicData/Cache/Internal/MergeManyCacheChangeSetsSourceCompare.cs
@@ -1,10 +1,9 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
using System.Reactive.Linq;
using DynamicData.Internal;
-using DynamicData.PLinq;
namespace DynamicData.Cache.Internal;
diff --git a/src/DynamicData/Cache/Internal/MergeManyItems.cs b/src/DynamicData/Cache/Internal/MergeManyItems.cs
index 3fef8f087..26b85614b 100644
--- a/src/DynamicData/Cache/Internal/MergeManyItems.cs
+++ b/src/DynamicData/Cache/Internal/MergeManyItems.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/MergeManyListChangeSets.cs b/src/DynamicData/Cache/Internal/MergeManyListChangeSets.cs
index 054d24d3d..bd7b18f4d 100644
--- a/src/DynamicData/Cache/Internal/MergeManyListChangeSets.cs
+++ b/src/DynamicData/Cache/Internal/MergeManyListChangeSets.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ObservableWithValue.cs b/src/DynamicData/Cache/Internal/ObservableWithValue.cs
index ae673f9f5..51ae8ac9d 100644
--- a/src/DynamicData/Cache/Internal/ObservableWithValue.cs
+++ b/src/DynamicData/Cache/Internal/ObservableWithValue.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/OfType.cs b/src/DynamicData/Cache/Internal/OfType.cs
index 6fb662efd..17546116d 100644
--- a/src/DynamicData/Cache/Internal/OfType.cs
+++ b/src/DynamicData/Cache/Internal/OfType.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/OnBeingRemoved.cs b/src/DynamicData/Cache/Internal/OnBeingRemoved.cs
index 42e6a2a80..c66f414db 100644
--- a/src/DynamicData/Cache/Internal/OnBeingRemoved.cs
+++ b/src/DynamicData/Cache/Internal/OnBeingRemoved.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/Page.cs b/src/DynamicData/Cache/Internal/Page.cs
index 07ab110e0..f7c5b8755 100644
--- a/src/DynamicData/Cache/Internal/Page.cs
+++ b/src/DynamicData/Cache/Internal/Page.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -28,7 +28,7 @@ private sealed class Paginator
{
private IKeyValueCollection _all = new KeyValueCollection();
- private IKeyValueCollection _current = new KeyValueCollection();
+ private KeyValueCollection _current = new();
private bool _isLoaded;
diff --git a/src/DynamicData/Cache/Internal/QueryWhenChanged.cs b/src/DynamicData/Cache/Internal/QueryWhenChanged.cs
index 053eecc05..5dab527ee 100644
--- a/src/DynamicData/Cache/Internal/QueryWhenChanged.cs
+++ b/src/DynamicData/Cache/Internal/QueryWhenChanged.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/ReaderWriter.cs b/src/DynamicData/Cache/Internal/ReaderWriter.cs
index 5536b9b0b..bbe56eb14 100644
--- a/src/DynamicData/Cache/Internal/ReaderWriter.cs
+++ b/src/DynamicData/Cache/Internal/ReaderWriter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/RefCount.cs b/src/DynamicData/Cache/Internal/RefCount.cs
index 44b964a19..4c4736391 100644
--- a/src/DynamicData/Cache/Internal/RefCount.cs
+++ b/src/DynamicData/Cache/Internal/RefCount.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/RemoveKeyEnumerator.cs b/src/DynamicData/Cache/Internal/RemoveKeyEnumerator.cs
index 2a7b02e74..716d847d5 100644
--- a/src/DynamicData/Cache/Internal/RemoveKeyEnumerator.cs
+++ b/src/DynamicData/Cache/Internal/RemoveKeyEnumerator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/RightJoin.cs b/src/DynamicData/Cache/Internal/RightJoin.cs
index 74d42d91e..cd4fb87db 100644
--- a/src/DynamicData/Cache/Internal/RightJoin.cs
+++ b/src/DynamicData/Cache/Internal/RightJoin.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/RightJoinMany.cs b/src/DynamicData/Cache/Internal/RightJoinMany.cs
index dea3312c0..825d71a90 100644
--- a/src/DynamicData/Cache/Internal/RightJoinMany.cs
+++ b/src/DynamicData/Cache/Internal/RightJoinMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/SizeExpirer.cs b/src/DynamicData/Cache/Internal/SizeExpirer.cs
index c4f47055c..ede14bced 100644
--- a/src/DynamicData/Cache/Internal/SizeExpirer.cs
+++ b/src/DynamicData/Cache/Internal/SizeExpirer.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/SizeLimiter.cs b/src/DynamicData/Cache/Internal/SizeLimiter.cs
index 11df5324d..bfd0fa72f 100644
--- a/src/DynamicData/Cache/Internal/SizeLimiter.cs
+++ b/src/DynamicData/Cache/Internal/SizeLimiter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -32,6 +32,6 @@ public KeyValuePair[] CloneAndReturnExpiredOnly(IChangeSet exp.Value.Index).Skip(size).Select(kvp => new KeyValuePair(kvp.Key, kvp.Value.Value)).ToArray();
+ return [.. _cache.KeyValues.OrderByDescending(exp => exp.Value.Index).Skip(size).Select(kvp => new KeyValuePair(kvp.Key, kvp.Value.Value))];
}
}
diff --git a/src/DynamicData/Cache/Internal/Sort.cs b/src/DynamicData/Cache/Internal/Sort.cs
index a7159a88c..feeb98c7f 100644
--- a/src/DynamicData/Cache/Internal/Sort.cs
+++ b/src/DynamicData/Cache/Internal/Sort.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/SortAndPage.cs b/src/DynamicData/Cache/Internal/SortAndPage.cs
index 806c54f11..768b5d024 100644
--- a/src/DynamicData/Cache/Internal/SortAndPage.cs
+++ b/src/DynamicData/Cache/Internal/SortAndPage.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/SortAndVirtualize.cs b/src/DynamicData/Cache/Internal/SortAndVirtualize.cs
index 51509607d..1e18a940c 100644
--- a/src/DynamicData/Cache/Internal/SortAndVirtualize.cs
+++ b/src/DynamicData/Cache/Internal/SortAndVirtualize.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/SortExtensions.cs b/src/DynamicData/Cache/Internal/SortExtensions.cs
index 3fbbae98d..c6275a358 100644
--- a/src/DynamicData/Cache/Internal/SortExtensions.cs
+++ b/src/DynamicData/Cache/Internal/SortExtensions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/SortedKeyValueApplicator.cs b/src/DynamicData/Cache/Internal/SortedKeyValueApplicator.cs
index 80b6ab9dd..4ab732ceb 100644
--- a/src/DynamicData/Cache/Internal/SortedKeyValueApplicator.cs
+++ b/src/DynamicData/Cache/Internal/SortedKeyValueApplicator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/SpecifiedGrouper.cs b/src/DynamicData/Cache/Internal/SpecifiedGrouper.cs
index 646cb4eb3..4cf20cdfc 100644
--- a/src/DynamicData/Cache/Internal/SpecifiedGrouper.cs
+++ b/src/DynamicData/Cache/Internal/SpecifiedGrouper.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/StaticFilter.cs b/src/DynamicData/Cache/Internal/StaticFilter.cs
index d6fc7cbe5..b746fbab4 100644
--- a/src/DynamicData/Cache/Internal/StaticFilter.cs
+++ b/src/DynamicData/Cache/Internal/StaticFilter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/StatusMonitor.cs b/src/DynamicData/Cache/Internal/StatusMonitor.cs
index bca5faaed..445074b63 100644
--- a/src/DynamicData/Cache/Internal/StatusMonitor.cs
+++ b/src/DynamicData/Cache/Internal/StatusMonitor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/SubscribeMany.cs b/src/DynamicData/Cache/Internal/SubscribeMany.cs
index bf6eb1d9f..78579fbeb 100644
--- a/src/DynamicData/Cache/Internal/SubscribeMany.cs
+++ b/src/DynamicData/Cache/Internal/SubscribeMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/Switch.cs b/src/DynamicData/Cache/Internal/Switch.cs
index 2c4c9f28e..77a0c16b1 100644
--- a/src/DynamicData/Cache/Internal/Switch.cs
+++ b/src/DynamicData/Cache/Internal/Switch.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -37,9 +37,9 @@ public IObservable> Run() => Observable.Create Run()
source: _observableSelector.Invoke(item)))
.Publish();
- var subscription = Observable.CombineLatest(
- // Make sure we subscribe to ALL of the items before we make the first evaluation of the collection, so any values published on-subscription don't trigger a re-evaluation of the matcher method.
- first: itemsWithValues.MergeMany(item => item.Observable),
+ var subscription = itemsWithValues.MergeMany(item => item.Observable).CombineLatest(
second: itemsWithValues.ToCollection(),
// We don't need to actually look at the changed values, we just need them as a trigger to re-evaluate the matcher method.
resultSelector: (_, itemsWithValues) => _collectionMatcher.Invoke(itemsWithValues))
diff --git a/src/DynamicData/Cache/Internal/UniquenessEnforcer.cs b/src/DynamicData/Cache/Internal/UniquenessEnforcer.cs
index 45900c096..0c858419c 100644
--- a/src/DynamicData/Cache/Internal/UniquenessEnforcer.cs
+++ b/src/DynamicData/Cache/Internal/UniquenessEnforcer.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Internal/Virtualise.cs b/src/DynamicData/Cache/Internal/Virtualise.cs
index a7dccae45..724682ab1 100644
--- a/src/DynamicData/Cache/Internal/Virtualise.cs
+++ b/src/DynamicData/Cache/Internal/Virtualise.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -29,7 +29,7 @@ private sealed class Virtualiser(VirtualRequest? request = null)
{
private IKeyValueCollection _all = new KeyValueCollection();
- private IKeyValueCollection _current = new KeyValueCollection();
+ private KeyValueCollection _current = new();
private bool _isLoaded;
diff --git a/src/DynamicData/Cache/MissingKeyException.cs b/src/DynamicData/Cache/MissingKeyException.cs
index 18ae1126e..72b2b2bea 100644
--- a/src/DynamicData/Cache/MissingKeyException.cs
+++ b/src/DynamicData/Cache/MissingKeyException.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Node.cs b/src/DynamicData/Cache/Node.cs
index fc082f12e..44918b4c1 100644
--- a/src/DynamicData/Cache/Node.cs
+++ b/src/DynamicData/Cache/Node.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ObservableCache.cs b/src/DynamicData/Cache/ObservableCache.cs
index 7d18f3dbc..e56bab14f 100644
--- a/src/DynamicData/Cache/ObservableCache.cs
+++ b/src/DynamicData/Cache/ObservableCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ObservableCacheEx.SortAndBind.cs b/src/DynamicData/Cache/ObservableCacheEx.SortAndBind.cs
index 6bec8c6af..06c14e0d4 100644
--- a/src/DynamicData/Cache/ObservableCacheEx.SortAndBind.cs
+++ b/src/DynamicData/Cache/ObservableCacheEx.SortAndBind.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ObservableCacheEx.VirtualiseAndPage.cs b/src/DynamicData/Cache/ObservableCacheEx.VirtualiseAndPage.cs
index 6d54897f8..d4a5f060c 100644
--- a/src/DynamicData/Cache/ObservableCacheEx.VirtualiseAndPage.cs
+++ b/src/DynamicData/Cache/ObservableCacheEx.VirtualiseAndPage.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/ObservableCacheEx.cs b/src/DynamicData/Cache/ObservableCacheEx.cs
index c67c2cf55..14e277038 100644
--- a/src/DynamicData/Cache/ObservableCacheEx.cs
+++ b/src/DynamicData/Cache/ObservableCacheEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -1662,32 +1662,6 @@ public static IObservable> FilterOnObservable filterFactory(obj), buffer, scheduler);
}
- ///
- /// Filters source on the specified property using the specified predicate.
- /// The filter will automatically reapply when a property changes.
- /// When there are likely to be a large number of property changes specify a throttle to improve performance.
- ///
- /// The type of the object.
- /// The type of the key.
- /// The type of the property.
- /// The source.
- /// The property selector. When the property changes a the filter specified will be re-evaluated.
- /// A predicate based on the object which contains the changed property.
- /// The property changed throttle.
- /// The scheduler used when throttling.
- /// An observable which emits change sets.
- [Obsolete("Use AutoRefresh(), followed by Filter() instead")]
- public static IObservable> FilterOnProperty(this IObservable> source, Expression> propertySelector, Func predicate, TimeSpan? propertyChangedThrottle = null, IScheduler? scheduler = null)
- where TObject : INotifyPropertyChanged
- where TKey : notnull
- {
- source.ThrowArgumentNullExceptionIfNull(nameof(source));
- propertySelector.ThrowArgumentNullExceptionIfNull(nameof(propertySelector));
- predicate.ThrowArgumentNullExceptionIfNull(nameof(predicate));
-
- return new FilterOnProperty(source, propertySelector, predicate, propertyChangedThrottle, scheduler).Run();
- }
-
///
/// Ensure that finally is always called. Thanks to Lee Campbell for this.
///
diff --git a/src/DynamicData/Cache/PageContext.cs b/src/DynamicData/Cache/PageContext.cs
index 15f34c1a3..a36afc396 100644
--- a/src/DynamicData/Cache/PageContext.cs
+++ b/src/DynamicData/Cache/PageContext.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/PageRequest.cs b/src/DynamicData/Cache/PageRequest.cs
index a6cb54620..bddf8f33a 100644
--- a/src/DynamicData/Cache/PageRequest.cs
+++ b/src/DynamicData/Cache/PageRequest.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/PageResponse.cs b/src/DynamicData/Cache/PageResponse.cs
index 317163429..425eb440e 100644
--- a/src/DynamicData/Cache/PageResponse.cs
+++ b/src/DynamicData/Cache/PageResponse.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/PagedChangeSet.cs b/src/DynamicData/Cache/PagedChangeSet.cs
index 587d99a05..f16135527 100644
--- a/src/DynamicData/Cache/PagedChangeSet.cs
+++ b/src/DynamicData/Cache/PagedChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/SortAndPageOptions.cs b/src/DynamicData/Cache/SortAndPageOptions.cs
index 9722b139a..1783eced2 100644
--- a/src/DynamicData/Cache/SortAndPageOptions.cs
+++ b/src/DynamicData/Cache/SortAndPageOptions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/SortAndVirtualizeOptions.cs b/src/DynamicData/Cache/SortAndVirtualizeOptions.cs
index 36f272424..fa6843347 100644
--- a/src/DynamicData/Cache/SortAndVirtualizeOptions.cs
+++ b/src/DynamicData/Cache/SortAndVirtualizeOptions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/SortOptimisations.cs b/src/DynamicData/Cache/SortOptimisations.cs
index 56b1a3284..52cda18a8 100644
--- a/src/DynamicData/Cache/SortOptimisations.cs
+++ b/src/DynamicData/Cache/SortOptimisations.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/SortReason.cs b/src/DynamicData/Cache/SortReason.cs
index cc602271c..b94ab15e4 100644
--- a/src/DynamicData/Cache/SortReason.cs
+++ b/src/DynamicData/Cache/SortReason.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/SortedChangeSet.cs b/src/DynamicData/Cache/SortedChangeSet.cs
index 0a1bf615e..fa9e37be0 100644
--- a/src/DynamicData/Cache/SortedChangeSet.cs
+++ b/src/DynamicData/Cache/SortedChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/SourceCache.cs b/src/DynamicData/Cache/SourceCache.cs
index 1477728c5..5d281579c 100644
--- a/src/DynamicData/Cache/SourceCache.cs
+++ b/src/DynamicData/Cache/SourceCache.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/SourceCacheEx.cs b/src/DynamicData/Cache/SourceCacheEx.cs
index 5afb90d3f..fa7a2e430 100644
--- a/src/DynamicData/Cache/SourceCacheEx.cs
+++ b/src/DynamicData/Cache/SourceCacheEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Tests/ChangeSetAggregator.cs b/src/DynamicData/Cache/Tests/ChangeSetAggregator.cs
index bb07670ff..dd2f6acbb 100644
--- a/src/DynamicData/Cache/Tests/ChangeSetAggregator.cs
+++ b/src/DynamicData/Cache/Tests/ChangeSetAggregator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Tests/DistinctChangeSetAggregator.cs b/src/DynamicData/Cache/Tests/DistinctChangeSetAggregator.cs
index e8a620077..745bf27ae 100644
--- a/src/DynamicData/Cache/Tests/DistinctChangeSetAggregator.cs
+++ b/src/DynamicData/Cache/Tests/DistinctChangeSetAggregator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Tests/GroupChangeSetAggregator.cs b/src/DynamicData/Cache/Tests/GroupChangeSetAggregator.cs
index 26bc85f33..7711123f6 100644
--- a/src/DynamicData/Cache/Tests/GroupChangeSetAggregator.cs
+++ b/src/DynamicData/Cache/Tests/GroupChangeSetAggregator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Tests/PagedChangeSetAggregator.cs b/src/DynamicData/Cache/Tests/PagedChangeSetAggregator.cs
index e30f44f67..42ff87a74 100644
--- a/src/DynamicData/Cache/Tests/PagedChangeSetAggregator.cs
+++ b/src/DynamicData/Cache/Tests/PagedChangeSetAggregator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Tests/SortedChangeSetAggregator.cs b/src/DynamicData/Cache/Tests/SortedChangeSetAggregator.cs
index 4a6b8d326..70158e156 100644
--- a/src/DynamicData/Cache/Tests/SortedChangeSetAggregator.cs
+++ b/src/DynamicData/Cache/Tests/SortedChangeSetAggregator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Tests/TestEx.cs b/src/DynamicData/Cache/Tests/TestEx.cs
index 0feb06ef8..aada3066a 100644
--- a/src/DynamicData/Cache/Tests/TestEx.cs
+++ b/src/DynamicData/Cache/Tests/TestEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/Tests/VirtualChangeSetAggregator.cs b/src/DynamicData/Cache/Tests/VirtualChangeSetAggregator.cs
index 8ee283a80..b972709a5 100644
--- a/src/DynamicData/Cache/Tests/VirtualChangeSetAggregator.cs
+++ b/src/DynamicData/Cache/Tests/VirtualChangeSetAggregator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/TransformAsyncOptions.cs b/src/DynamicData/Cache/TransformAsyncOptions.cs
index e9b43aeba..19ed9ab40 100644
--- a/src/DynamicData/Cache/TransformAsyncOptions.cs
+++ b/src/DynamicData/Cache/TransformAsyncOptions.cs
@@ -1,6 +1,7 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
+
namespace DynamicData;
///
diff --git a/src/DynamicData/Cache/VirtualChangeSet.cs b/src/DynamicData/Cache/VirtualChangeSet.cs
index 5f599f5cd..3aae7f59f 100644
--- a/src/DynamicData/Cache/VirtualChangeSet.cs
+++ b/src/DynamicData/Cache/VirtualChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/VirtualContext.cs b/src/DynamicData/Cache/VirtualContext.cs
index 6c5ecfe25..f909ddbc0 100644
--- a/src/DynamicData/Cache/VirtualContext.cs
+++ b/src/DynamicData/Cache/VirtualContext.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/VirtualRequest.cs b/src/DynamicData/Cache/VirtualRequest.cs
index 242787e3d..4d94c9412 100644
--- a/src/DynamicData/Cache/VirtualRequest.cs
+++ b/src/DynamicData/Cache/VirtualRequest.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Cache/VirtualResponse.cs b/src/DynamicData/Cache/VirtualResponse.cs
index c9398a4e4..70152976c 100644
--- a/src/DynamicData/Cache/VirtualResponse.cs
+++ b/src/DynamicData/Cache/VirtualResponse.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Constants.cs b/src/DynamicData/Constants.cs
index 6edc84ed9..11f6d9330 100644
--- a/src/DynamicData/Constants.cs
+++ b/src/DynamicData/Constants.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Diagnostics/ChangeStatistics.cs b/src/DynamicData/Diagnostics/ChangeStatistics.cs
index 0a1cc2c95..b9ddf9f49 100644
--- a/src/DynamicData/Diagnostics/ChangeStatistics.cs
+++ b/src/DynamicData/Diagnostics/ChangeStatistics.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Diagnostics/ChangeSummary.cs b/src/DynamicData/Diagnostics/ChangeSummary.cs
index f41b93680..5b9f88a34 100644
--- a/src/DynamicData/Diagnostics/ChangeSummary.cs
+++ b/src/DynamicData/Diagnostics/ChangeSummary.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Diagnostics/DiagnosticOperators.cs b/src/DynamicData/Diagnostics/DiagnosticOperators.cs
index b0ea4b22f..0e13e735c 100644
--- a/src/DynamicData/Diagnostics/DiagnosticOperators.cs
+++ b/src/DynamicData/Diagnostics/DiagnosticOperators.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/DynamicData.csproj b/src/DynamicData/DynamicData.csproj
index df0ccd2ca..b7e7b212b 100644
--- a/src/DynamicData/DynamicData.csproj
+++ b/src/DynamicData/DynamicData.csproj
@@ -1,6 +1,6 @@
- netstandard2.0;net462;net6.0;net7.0;net8.0;net9.0
+ netstandard2.0;net462;net8.0;net6.0;net7.0;net8.0;net9.0;net10.0
true
true
enable
@@ -11,7 +11,7 @@
-
+
diff --git a/src/DynamicData/DynamicDataOptions.cs b/src/DynamicData/DynamicDataOptions.cs
index 584b9493e..4d0cececb 100644
--- a/src/DynamicData/DynamicDataOptions.cs
+++ b/src/DynamicData/DynamicDataOptions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/EnumerableEx.cs b/src/DynamicData/EnumerableEx.cs
index 2459f9a29..124a4da30 100644
--- a/src/DynamicData/EnumerableEx.cs
+++ b/src/DynamicData/EnumerableEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Experimental/ExperimentalEx.cs b/src/DynamicData/Experimental/ExperimentalEx.cs
index 206d427f1..69f7d3adc 100644
--- a/src/DynamicData/Experimental/ExperimentalEx.cs
+++ b/src/DynamicData/Experimental/ExperimentalEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Experimental/ISubjectWithRefCount.cs b/src/DynamicData/Experimental/ISubjectWithRefCount.cs
index 9e3ca92b5..3bf4d4eda 100644
--- a/src/DynamicData/Experimental/ISubjectWithRefCount.cs
+++ b/src/DynamicData/Experimental/ISubjectWithRefCount.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Experimental/IWatcher.cs b/src/DynamicData/Experimental/IWatcher.cs
index ae3a3426d..c936472ac 100644
--- a/src/DynamicData/Experimental/IWatcher.cs
+++ b/src/DynamicData/Experimental/IWatcher.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Experimental/SubjectWithRefCount.cs b/src/DynamicData/Experimental/SubjectWithRefCount.cs
index 55d359080..0554eb718 100644
--- a/src/DynamicData/Experimental/SubjectWithRefCount.cs
+++ b/src/DynamicData/Experimental/SubjectWithRefCount.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Experimental/Watcher.cs b/src/DynamicData/Experimental/Watcher.cs
index 70ee4a9c6..9825ae686 100644
--- a/src/DynamicData/Experimental/Watcher.cs
+++ b/src/DynamicData/Experimental/Watcher.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/GlobalConfig.cs b/src/DynamicData/GlobalConfig.cs
index 56916acb6..106e66aec 100644
--- a/src/DynamicData/GlobalConfig.cs
+++ b/src/DynamicData/GlobalConfig.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/IChangeSet.cs b/src/DynamicData/IChangeSet.cs
index 3d11cda0c..e0396936e 100644
--- a/src/DynamicData/IChangeSet.cs
+++ b/src/DynamicData/IChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Internal/CacheParentSubscription.cs b/src/DynamicData/Internal/CacheParentSubscription.cs
index b9a89e296..95e63daf0 100644
--- a/src/DynamicData/Internal/CacheParentSubscription.cs
+++ b/src/DynamicData/Internal/CacheParentSubscription.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Internal/ExceptionMixins.cs b/src/DynamicData/Internal/ExceptionMixins.cs
index a537ec825..7baad015f 100644
--- a/src/DynamicData/Internal/ExceptionMixins.cs
+++ b/src/DynamicData/Internal/ExceptionMixins.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Internal/KeyedDisposable.cs b/src/DynamicData/Internal/KeyedDisposable.cs
index e5658ac99..80d90fdff 100644
--- a/src/DynamicData/Internal/KeyedDisposable.cs
+++ b/src/DynamicData/Internal/KeyedDisposable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Internal/ObservableEx.cs b/src/DynamicData/Internal/ObservableEx.cs
index 53ef1ea82..8fce9a875 100644
--- a/src/DynamicData/Internal/ObservableEx.cs
+++ b/src/DynamicData/Internal/ObservableEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Internal/Rxx.cs b/src/DynamicData/Internal/Rxx.cs
index d5444716c..8fe86a561 100644
--- a/src/DynamicData/Internal/Rxx.cs
+++ b/src/DynamicData/Internal/Rxx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Internal/SwappableLock.cs b/src/DynamicData/Internal/SwappableLock.cs
index 71db3e726..267607e9b 100644
--- a/src/DynamicData/Internal/SwappableLock.cs
+++ b/src/DynamicData/Internal/SwappableLock.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/ConnectionStatus.cs b/src/DynamicData/Kernel/ConnectionStatus.cs
index 086772f94..a6a41d5cf 100644
--- a/src/DynamicData/Kernel/ConnectionStatus.cs
+++ b/src/DynamicData/Kernel/ConnectionStatus.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/EnumerableEx.cs b/src/DynamicData/Kernel/EnumerableEx.cs
index 186da84bb..afeca3d3e 100644
--- a/src/DynamicData/Kernel/EnumerableEx.cs
+++ b/src/DynamicData/Kernel/EnumerableEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -106,11 +106,8 @@ internal static void ForEach(this IEnumerable source, Action ToHashSet(this IEnumerable source) => new(source);
-#endif
-
///
/// Returns an object with it's current index.
///
diff --git a/src/DynamicData/Kernel/EnumerableIList.cs b/src/DynamicData/Kernel/EnumerableIList.cs
index 924644fa4..242f83b67 100644
--- a/src/DynamicData/Kernel/EnumerableIList.cs
+++ b/src/DynamicData/Kernel/EnumerableIList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/EnumeratorIList.cs b/src/DynamicData/Kernel/EnumeratorIList.cs
index 0b16655b7..237ad591e 100644
--- a/src/DynamicData/Kernel/EnumeratorIList.cs
+++ b/src/DynamicData/Kernel/EnumeratorIList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/Error.cs b/src/DynamicData/Kernel/Error.cs
index 8a1587f68..05d61f4a4 100644
--- a/src/DynamicData/Kernel/Error.cs
+++ b/src/DynamicData/Kernel/Error.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/IEnumerableIList.cs b/src/DynamicData/Kernel/IEnumerableIList.cs
index fc0c29dfe..34511c156 100644
--- a/src/DynamicData/Kernel/IEnumerableIList.cs
+++ b/src/DynamicData/Kernel/IEnumerableIList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/ISupportsCapacity.cs b/src/DynamicData/Kernel/ISupportsCapacity.cs
index 492ad06ed..ce0bfa83a 100644
--- a/src/DynamicData/Kernel/ISupportsCapacity.cs
+++ b/src/DynamicData/Kernel/ISupportsCapacity.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/InternalEx.cs b/src/DynamicData/Kernel/InternalEx.cs
index 4929bf69d..68e6fa47d 100644
--- a/src/DynamicData/Kernel/InternalEx.cs
+++ b/src/DynamicData/Kernel/InternalEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
@@ -15,9 +15,9 @@ namespace DynamicData.Kernel;
public static class InternalEx
{
#if NET9_0_OR_GREATER
- internal static Lock NewLock() => new Lock();
+ internal static Lock NewLock() => new();
#else
- internal static object NewLock() => new object();
+ internal static object NewLock() => new();
#endif
///
diff --git a/src/DynamicData/Kernel/ItemWithIndex.cs b/src/DynamicData/Kernel/ItemWithIndex.cs
index 13a2bca86..2fe6f7588 100644
--- a/src/DynamicData/Kernel/ItemWithIndex.cs
+++ b/src/DynamicData/Kernel/ItemWithIndex.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/ItemWithValue.cs b/src/DynamicData/Kernel/ItemWithValue.cs
index 9f4309993..16d22182b 100644
--- a/src/DynamicData/Kernel/ItemWithValue.cs
+++ b/src/DynamicData/Kernel/ItemWithValue.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/OptionElse.cs b/src/DynamicData/Kernel/OptionElse.cs
index 8ac8d2f75..d644e62de 100644
--- a/src/DynamicData/Kernel/OptionElse.cs
+++ b/src/DynamicData/Kernel/OptionElse.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/OptionExtensions.cs b/src/DynamicData/Kernel/OptionExtensions.cs
index e311ecfab..0c6c982cc 100644
--- a/src/DynamicData/Kernel/OptionExtensions.cs
+++ b/src/DynamicData/Kernel/OptionExtensions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/OptionObservableExtensions.cs b/src/DynamicData/Kernel/OptionObservableExtensions.cs
index 94e51bffa..bbb23a052 100644
--- a/src/DynamicData/Kernel/OptionObservableExtensions.cs
+++ b/src/DynamicData/Kernel/OptionObservableExtensions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/Optional.cs b/src/DynamicData/Kernel/Optional.cs
index c0ab13f36..0dbbd567f 100644
--- a/src/DynamicData/Kernel/Optional.cs
+++ b/src/DynamicData/Kernel/Optional.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/ParallelEx.cs b/src/DynamicData/Kernel/ParallelEx.cs
index eb26e42df..c5b1ff14d 100644
--- a/src/DynamicData/Kernel/ParallelEx.cs
+++ b/src/DynamicData/Kernel/ParallelEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/ReadOnlyCollectionLight.cs b/src/DynamicData/Kernel/ReadOnlyCollectionLight.cs
index 494e3bdb1..3f621f60b 100644
--- a/src/DynamicData/Kernel/ReadOnlyCollectionLight.cs
+++ b/src/DynamicData/Kernel/ReadOnlyCollectionLight.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Kernel/ReferenceEqualityComparer.cs b/src/DynamicData/Kernel/ReferenceEqualityComparer.cs
index e1e6ae703..962be384f 100644
--- a/src/DynamicData/Kernel/ReferenceEqualityComparer.cs
+++ b/src/DynamicData/Kernel/ReferenceEqualityComparer.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Change.cs b/src/DynamicData/List/Change.cs
index 7c802e845..3647dccc9 100644
--- a/src/DynamicData/List/Change.cs
+++ b/src/DynamicData/List/Change.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ChangeAwareList.cs b/src/DynamicData/List/ChangeAwareList.cs
index 7f0625af6..90d8e3abc 100644
--- a/src/DynamicData/List/ChangeAwareList.cs
+++ b/src/DynamicData/List/ChangeAwareList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ChangeAwareListWithRefCounts.cs b/src/DynamicData/List/ChangeAwareListWithRefCounts.cs
index cf4a0d689..234b07930 100644
--- a/src/DynamicData/List/ChangeAwareListWithRefCounts.cs
+++ b/src/DynamicData/List/ChangeAwareListWithRefCounts.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ChangeSet.cs b/src/DynamicData/List/ChangeSet.cs
index f41b95121..d1b18aa09 100644
--- a/src/DynamicData/List/ChangeSet.cs
+++ b/src/DynamicData/List/ChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ChangeSetEx.cs b/src/DynamicData/List/ChangeSetEx.cs
index c2655148c..7abe7c5fa 100644
--- a/src/DynamicData/List/ChangeSetEx.cs
+++ b/src/DynamicData/List/ChangeSetEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ChangeType.cs b/src/DynamicData/List/ChangeType.cs
index 193f7218d..481e7c1bf 100644
--- a/src/DynamicData/List/ChangeType.cs
+++ b/src/DynamicData/List/ChangeType.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/IChangeSet.cs b/src/DynamicData/List/IChangeSet.cs
index fa887c7e2..36434a08d 100644
--- a/src/DynamicData/List/IChangeSet.cs
+++ b/src/DynamicData/List/IChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/IChangeSetAdaptor.cs b/src/DynamicData/List/IChangeSetAdaptor.cs
index 71442a0d0..db579cb12 100644
--- a/src/DynamicData/List/IChangeSetAdaptor.cs
+++ b/src/DynamicData/List/IChangeSetAdaptor.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/IExtendedList.cs b/src/DynamicData/List/IExtendedList.cs
index 6a425aa0a..8afb9e5df 100644
--- a/src/DynamicData/List/IExtendedList.cs
+++ b/src/DynamicData/List/IExtendedList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/IGroup.cs b/src/DynamicData/List/IGroup.cs
index 337f595ef..c8f4e09e9 100644
--- a/src/DynamicData/List/IGroup.cs
+++ b/src/DynamicData/List/IGroup.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/IGrouping.cs b/src/DynamicData/List/IGrouping.cs
index d6bc8e085..30af65d59 100644
--- a/src/DynamicData/List/IGrouping.cs
+++ b/src/DynamicData/List/IGrouping.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/IObservableList.cs b/src/DynamicData/List/IObservableList.cs
index 84326d403..0935c0df0 100644
--- a/src/DynamicData/List/IObservableList.cs
+++ b/src/DynamicData/List/IObservableList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/IPageChangeSet.cs b/src/DynamicData/List/IPageChangeSet.cs
index d8e3b6a03..447612a76 100644
--- a/src/DynamicData/List/IPageChangeSet.cs
+++ b/src/DynamicData/List/IPageChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ISourceList.cs b/src/DynamicData/List/ISourceList.cs
index d943cccd1..d75ec1042 100644
--- a/src/DynamicData/List/ISourceList.cs
+++ b/src/DynamicData/List/ISourceList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/IVirtualChangeSet.cs b/src/DynamicData/List/IVirtualChangeSet.cs
index 407b42cfd..c971d7a3f 100644
--- a/src/DynamicData/List/IVirtualChangeSet.cs
+++ b/src/DynamicData/List/IVirtualChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/AnonymousObservableList.cs b/src/DynamicData/List/Internal/AnonymousObservableList.cs
index 46da9e587..79051b1d6 100644
--- a/src/DynamicData/List/Internal/AnonymousObservableList.cs
+++ b/src/DynamicData/List/Internal/AnonymousObservableList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/AutoRefresh.cs b/src/DynamicData/List/Internal/AutoRefresh.cs
index 8bbf2a0c6..da2e4dc6a 100644
--- a/src/DynamicData/List/Internal/AutoRefresh.cs
+++ b/src/DynamicData/List/Internal/AutoRefresh.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/BufferIf.cs b/src/DynamicData/List/Internal/BufferIf.cs
index ea65f9c43..8f7d1993c 100644
--- a/src/DynamicData/List/Internal/BufferIf.cs
+++ b/src/DynamicData/List/Internal/BufferIf.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/ChangeSetMergeTracker.cs b/src/DynamicData/List/Internal/ChangeSetMergeTracker.cs
index b9233fb4f..fa2e2cec0 100644
--- a/src/DynamicData/List/Internal/ChangeSetMergeTracker.cs
+++ b/src/DynamicData/List/Internal/ChangeSetMergeTracker.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/ClonedListChangeSet.cs b/src/DynamicData/List/Internal/ClonedListChangeSet.cs
index d819c6737..3b9996a1f 100644
--- a/src/DynamicData/List/Internal/ClonedListChangeSet.cs
+++ b/src/DynamicData/List/Internal/ClonedListChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Combiner.cs b/src/DynamicData/List/Internal/Combiner.cs
index 2912e8442..64882a3ba 100644
--- a/src/DynamicData/List/Internal/Combiner.cs
+++ b/src/DynamicData/List/Internal/Combiner.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/DeferUntilLoaded.cs b/src/DynamicData/List/Internal/DeferUntilLoaded.cs
index 19f0a39e0..aae382472 100644
--- a/src/DynamicData/List/Internal/DeferUntilLoaded.cs
+++ b/src/DynamicData/List/Internal/DeferUntilLoaded.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/DisposeMany.cs b/src/DynamicData/List/Internal/DisposeMany.cs
index 332f638e1..046e19e4d 100644
--- a/src/DynamicData/List/Internal/DisposeMany.cs
+++ b/src/DynamicData/List/Internal/DisposeMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Distinct.cs b/src/DynamicData/List/Internal/Distinct.cs
index 51daedb4e..00ab3a458 100644
--- a/src/DynamicData/List/Internal/Distinct.cs
+++ b/src/DynamicData/List/Internal/Distinct.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/DynamicCombiner.cs b/src/DynamicData/List/Internal/DynamicCombiner.cs
index 5b48f9414..bb3091378 100644
--- a/src/DynamicData/List/Internal/DynamicCombiner.cs
+++ b/src/DynamicData/List/Internal/DynamicCombiner.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/EditDiff.cs b/src/DynamicData/List/Internal/EditDiff.cs
index ca5d6081b..0c48ff45f 100644
--- a/src/DynamicData/List/Internal/EditDiff.cs
+++ b/src/DynamicData/List/Internal/EditDiff.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/ExpirableItem.cs b/src/DynamicData/List/Internal/ExpirableItem.cs
index 90da98574..23227719a 100644
--- a/src/DynamicData/List/Internal/ExpirableItem.cs
+++ b/src/DynamicData/List/Internal/ExpirableItem.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/ExpireAfter.cs b/src/DynamicData/List/Internal/ExpireAfter.cs
index 2b5fd6545..97a39c84e 100644
--- a/src/DynamicData/List/Internal/ExpireAfter.cs
+++ b/src/DynamicData/List/Internal/ExpireAfter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Filter.WithPredicateState.cs b/src/DynamicData/List/Internal/Filter.WithPredicateState.cs
index e89c403e8..c9f04be4f 100644
--- a/src/DynamicData/List/Internal/Filter.WithPredicateState.cs
+++ b/src/DynamicData/List/Internal/Filter.WithPredicateState.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Filter.cs b/src/DynamicData/List/Internal/Filter.cs
index 364d43595..f1cbd56d5 100644
--- a/src/DynamicData/List/Internal/Filter.cs
+++ b/src/DynamicData/List/Internal/Filter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/FilterOnObservable.cs b/src/DynamicData/List/Internal/FilterOnObservable.cs
index 3590b7914..1d2dae5e0 100644
--- a/src/DynamicData/List/Internal/FilterOnObservable.cs
+++ b/src/DynamicData/List/Internal/FilterOnObservable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/FilterOnProperty.cs b/src/DynamicData/List/Internal/FilterOnProperty.cs
index a2b7f9112..d73b8e238 100644
--- a/src/DynamicData/List/Internal/FilterOnProperty.cs
+++ b/src/DynamicData/List/Internal/FilterOnProperty.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/FilterStatic.cs b/src/DynamicData/List/Internal/FilterStatic.cs
index be99eaff9..23786400e 100644
--- a/src/DynamicData/List/Internal/FilterStatic.cs
+++ b/src/DynamicData/List/Internal/FilterStatic.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Group.cs b/src/DynamicData/List/Internal/Group.cs
index dfe64957a..d6cd72e2d 100644
--- a/src/DynamicData/List/Internal/Group.cs
+++ b/src/DynamicData/List/Internal/Group.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/GroupOn.cs b/src/DynamicData/List/Internal/GroupOn.cs
index dd6b768b2..6ea7deccd 100644
--- a/src/DynamicData/List/Internal/GroupOn.cs
+++ b/src/DynamicData/List/Internal/GroupOn.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/GroupOnImmutable.cs b/src/DynamicData/List/Internal/GroupOnImmutable.cs
index 1ccd85373..2b4a08be8 100644
--- a/src/DynamicData/List/Internal/GroupOnImmutable.cs
+++ b/src/DynamicData/List/Internal/GroupOnImmutable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/GroupOnProperty.cs b/src/DynamicData/List/Internal/GroupOnProperty.cs
index 5b1bda011..ab5998aed 100644
--- a/src/DynamicData/List/Internal/GroupOnProperty.cs
+++ b/src/DynamicData/List/Internal/GroupOnProperty.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/GroupOnPropertyWithImmutableState.cs b/src/DynamicData/List/Internal/GroupOnPropertyWithImmutableState.cs
index 29f278b91..99d8b1d75 100644
--- a/src/DynamicData/List/Internal/GroupOnPropertyWithImmutableState.cs
+++ b/src/DynamicData/List/Internal/GroupOnPropertyWithImmutableState.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/ImmutableGroup.cs b/src/DynamicData/List/Internal/ImmutableGroup.cs
index c06f1830e..3ad76d595 100644
--- a/src/DynamicData/List/Internal/ImmutableGroup.cs
+++ b/src/DynamicData/List/Internal/ImmutableGroup.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/LimitSizeTo.cs b/src/DynamicData/List/Internal/LimitSizeTo.cs
index 8c186d667..c2ed74896 100644
--- a/src/DynamicData/List/Internal/LimitSizeTo.cs
+++ b/src/DynamicData/List/Internal/LimitSizeTo.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/MergeChangeSets.cs b/src/DynamicData/List/Internal/MergeChangeSets.cs
index 91be5634b..480c69b3a 100644
--- a/src/DynamicData/List/Internal/MergeChangeSets.cs
+++ b/src/DynamicData/List/Internal/MergeChangeSets.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/MergeMany.cs b/src/DynamicData/List/Internal/MergeMany.cs
index 918bddb09..65b238068 100644
--- a/src/DynamicData/List/Internal/MergeMany.cs
+++ b/src/DynamicData/List/Internal/MergeMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/MergeManyCacheChangeSets.cs b/src/DynamicData/List/Internal/MergeManyCacheChangeSets.cs
index 5c54925dc..3b63ea231 100644
--- a/src/DynamicData/List/Internal/MergeManyCacheChangeSets.cs
+++ b/src/DynamicData/List/Internal/MergeManyCacheChangeSets.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/MergeManyListChangeSets.cs b/src/DynamicData/List/Internal/MergeManyListChangeSets.cs
index 99c24b383..482c4f46b 100644
--- a/src/DynamicData/List/Internal/MergeManyListChangeSets.cs
+++ b/src/DynamicData/List/Internal/MergeManyListChangeSets.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/OnBeingAdded.cs b/src/DynamicData/List/Internal/OnBeingAdded.cs
index b8e065fc7..44776f73f 100644
--- a/src/DynamicData/List/Internal/OnBeingAdded.cs
+++ b/src/DynamicData/List/Internal/OnBeingAdded.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/OnBeingRemoved.cs b/src/DynamicData/List/Internal/OnBeingRemoved.cs
index dfae92ef9..48b8e01e9 100644
--- a/src/DynamicData/List/Internal/OnBeingRemoved.cs
+++ b/src/DynamicData/List/Internal/OnBeingRemoved.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Pager.cs b/src/DynamicData/List/Internal/Pager.cs
index 041d4fcce..bd3238d2a 100644
--- a/src/DynamicData/List/Internal/Pager.cs
+++ b/src/DynamicData/List/Internal/Pager.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/QueryWhenChanged.cs b/src/DynamicData/List/Internal/QueryWhenChanged.cs
index 0336f51db..ef58d4925 100644
--- a/src/DynamicData/List/Internal/QueryWhenChanged.cs
+++ b/src/DynamicData/List/Internal/QueryWhenChanged.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/ReaderWriter.cs b/src/DynamicData/List/Internal/ReaderWriter.cs
index 83f36f3fc..57b413867 100644
--- a/src/DynamicData/List/Internal/ReaderWriter.cs
+++ b/src/DynamicData/List/Internal/ReaderWriter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/RefCount.cs b/src/DynamicData/List/Internal/RefCount.cs
index e3aeb7e00..b40036c3e 100644
--- a/src/DynamicData/List/Internal/RefCount.cs
+++ b/src/DynamicData/List/Internal/RefCount.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/ReferenceCountTracker.cs b/src/DynamicData/List/Internal/ReferenceCountTracker.cs
index bb3e92dc7..6959b83eb 100644
--- a/src/DynamicData/List/Internal/ReferenceCountTracker.cs
+++ b/src/DynamicData/List/Internal/ReferenceCountTracker.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Sort.cs b/src/DynamicData/List/Internal/Sort.cs
index 0e1a1338a..ff03e2e70 100644
--- a/src/DynamicData/List/Internal/Sort.cs
+++ b/src/DynamicData/List/Internal/Sort.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/SubscribeMany.cs b/src/DynamicData/List/Internal/SubscribeMany.cs
index 2389d78ff..75075b04e 100644
--- a/src/DynamicData/List/Internal/SubscribeMany.cs
+++ b/src/DynamicData/List/Internal/SubscribeMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Switch.cs b/src/DynamicData/List/Internal/Switch.cs
index f95fb2f4b..9425771dd 100644
--- a/src/DynamicData/List/Internal/Switch.cs
+++ b/src/DynamicData/List/Internal/Switch.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/ToObservableChangeSet.cs b/src/DynamicData/List/Internal/ToObservableChangeSet.cs
index 03bde4c0b..8d1f853d2 100644
--- a/src/DynamicData/List/Internal/ToObservableChangeSet.cs
+++ b/src/DynamicData/List/Internal/ToObservableChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/TransformAsync.cs b/src/DynamicData/List/Internal/TransformAsync.cs
index 87b833b6a..b43edc030 100644
--- a/src/DynamicData/List/Internal/TransformAsync.cs
+++ b/src/DynamicData/List/Internal/TransformAsync.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/TransformMany.cs b/src/DynamicData/List/Internal/TransformMany.cs
index e595b7caf..d7bb2a69e 100644
--- a/src/DynamicData/List/Internal/TransformMany.cs
+++ b/src/DynamicData/List/Internal/TransformMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Transformer.cs b/src/DynamicData/List/Internal/Transformer.cs
index ce1634b03..69dbb11b2 100644
--- a/src/DynamicData/List/Internal/Transformer.cs
+++ b/src/DynamicData/List/Internal/Transformer.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/UnifiedChange.cs b/src/DynamicData/List/Internal/UnifiedChange.cs
index 085ca6fd3..eb971b7ae 100644
--- a/src/DynamicData/List/Internal/UnifiedChange.cs
+++ b/src/DynamicData/List/Internal/UnifiedChange.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Internal/Virtualiser.cs b/src/DynamicData/List/Internal/Virtualiser.cs
index 2e352230f..bb2f894c2 100644
--- a/src/DynamicData/List/Internal/Virtualiser.cs
+++ b/src/DynamicData/List/Internal/Virtualiser.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ItemChange.cs b/src/DynamicData/List/ItemChange.cs
index c71936984..6d79a57e3 100644
--- a/src/DynamicData/List/ItemChange.cs
+++ b/src/DynamicData/List/ItemChange.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Linq/AddKeyEnumerator.cs b/src/DynamicData/List/Linq/AddKeyEnumerator.cs
index ef288a1c7..150c7c4a6 100644
--- a/src/DynamicData/List/Linq/AddKeyEnumerator.cs
+++ b/src/DynamicData/List/Linq/AddKeyEnumerator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Linq/ItemChangeEnumerator.cs b/src/DynamicData/List/Linq/ItemChangeEnumerator.cs
index 9736149dc..53c975d0a 100644
--- a/src/DynamicData/List/Linq/ItemChangeEnumerator.cs
+++ b/src/DynamicData/List/Linq/ItemChangeEnumerator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Linq/Reverser.cs b/src/DynamicData/List/Linq/Reverser.cs
index 67cf918d1..9be4b678a 100644
--- a/src/DynamicData/List/Linq/Reverser.cs
+++ b/src/DynamicData/List/Linq/Reverser.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Linq/UnifiedChangeEnumerator.cs b/src/DynamicData/List/Linq/UnifiedChangeEnumerator.cs
index 2c81f8da2..4a8d0c352 100644
--- a/src/DynamicData/List/Linq/UnifiedChangeEnumerator.cs
+++ b/src/DynamicData/List/Linq/UnifiedChangeEnumerator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Linq/WithoutIndexEnumerator.cs b/src/DynamicData/List/Linq/WithoutIndexEnumerator.cs
index 47f02f031..269bf2c2e 100644
--- a/src/DynamicData/List/Linq/WithoutIndexEnumerator.cs
+++ b/src/DynamicData/List/Linq/WithoutIndexEnumerator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ListChangeReason.cs b/src/DynamicData/List/ListChangeReason.cs
index 6d12c82a3..89d8aa2dc 100644
--- a/src/DynamicData/List/ListChangeReason.cs
+++ b/src/DynamicData/List/ListChangeReason.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ListEx.cs b/src/DynamicData/List/ListEx.cs
index 11747228e..7035b1d4d 100644
--- a/src/DynamicData/List/ListEx.cs
+++ b/src/DynamicData/List/ListEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ListFilterPolicy.cs b/src/DynamicData/List/ListFilterPolicy.cs
index 89b812208..690998086 100644
--- a/src/DynamicData/List/ListFilterPolicy.cs
+++ b/src/DynamicData/List/ListFilterPolicy.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/ObservableListEx.cs b/src/DynamicData/List/ObservableListEx.cs
index 48cbe3af6..dc86ef697 100644
--- a/src/DynamicData/List/ObservableListEx.cs
+++ b/src/DynamicData/List/ObservableListEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/PageChangeSet.cs b/src/DynamicData/List/PageChangeSet.cs
index 2623fb860..c746ca0e3 100644
--- a/src/DynamicData/List/PageChangeSet.cs
+++ b/src/DynamicData/List/PageChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/RangeChange.cs b/src/DynamicData/List/RangeChange.cs
index 5df0fa704..c056308f3 100644
--- a/src/DynamicData/List/RangeChange.cs
+++ b/src/DynamicData/List/RangeChange.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/SortException.cs b/src/DynamicData/List/SortException.cs
index 7149a124e..42da97c8a 100644
--- a/src/DynamicData/List/SortException.cs
+++ b/src/DynamicData/List/SortException.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/SortOptions.cs b/src/DynamicData/List/SortOptions.cs
index c8625056a..14beb63d7 100644
--- a/src/DynamicData/List/SortOptions.cs
+++ b/src/DynamicData/List/SortOptions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/SourceList.cs b/src/DynamicData/List/SourceList.cs
index ad21d900b..3db42bc11 100644
--- a/src/DynamicData/List/SourceList.cs
+++ b/src/DynamicData/List/SourceList.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/SourceListEditConvenienceEx.cs b/src/DynamicData/List/SourceListEditConvenienceEx.cs
index f266af37e..7c08529f8 100644
--- a/src/DynamicData/List/SourceListEditConvenienceEx.cs
+++ b/src/DynamicData/List/SourceListEditConvenienceEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/SourceListEx.cs b/src/DynamicData/List/SourceListEx.cs
index 066261609..78ca4d971 100644
--- a/src/DynamicData/List/SourceListEx.cs
+++ b/src/DynamicData/List/SourceListEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Tests/ChangeSetAggregator.cs b/src/DynamicData/List/Tests/ChangeSetAggregator.cs
index d2a2adac5..afac4458b 100644
--- a/src/DynamicData/List/Tests/ChangeSetAggregator.cs
+++ b/src/DynamicData/List/Tests/ChangeSetAggregator.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/Tests/ListTextEx.cs b/src/DynamicData/List/Tests/ListTextEx.cs
index 7bae5af74..7913113bf 100644
--- a/src/DynamicData/List/Tests/ListTextEx.cs
+++ b/src/DynamicData/List/Tests/ListTextEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/UnspecifiedIndexException.cs b/src/DynamicData/List/UnspecifiedIndexException.cs
index c2b8f468d..643fa9f62 100644
--- a/src/DynamicData/List/UnspecifiedIndexException.cs
+++ b/src/DynamicData/List/UnspecifiedIndexException.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/List/VirtualChangeSet.cs b/src/DynamicData/List/VirtualChangeSet.cs
index bf62b059e..086490a36 100644
--- a/src/DynamicData/List/VirtualChangeSet.cs
+++ b/src/DynamicData/List/VirtualChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/ObservableChangeSet.cs b/src/DynamicData/ObservableChangeSet.cs
index 9ac6646f6..e9106b3e3 100644
--- a/src/DynamicData/ObservableChangeSet.cs
+++ b/src/DynamicData/ObservableChangeSet.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/ObsoleteEx.cs b/src/DynamicData/ObsoleteEx.cs
deleted file mode 100644
index 2a64d7443..000000000
--- a/src/DynamicData/ObsoleteEx.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
-// Roland Pheasant licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for full license information.
-
-namespace DynamicData;
-
-///
-/// Obsolete methods: Kept in system to prevent breaking changes for now.
-///
-public static class ObsoleteEx
-{
-}
diff --git a/src/DynamicData/Platforms/net45/PFilter.cs b/src/DynamicData/Platforms/net45/PFilter.cs
index c7ef258f7..f4aff797e 100644
--- a/src/DynamicData/Platforms/net45/PFilter.cs
+++ b/src/DynamicData/Platforms/net45/PFilter.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Platforms/net45/PSubscribeMany.cs b/src/DynamicData/Platforms/net45/PSubscribeMany.cs
index 1ab71c2c8..4c9e4be35 100644
--- a/src/DynamicData/Platforms/net45/PSubscribeMany.cs
+++ b/src/DynamicData/Platforms/net45/PSubscribeMany.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Platforms/net45/PTransform.cs b/src/DynamicData/Platforms/net45/PTransform.cs
index a234965a0..a9871c335 100644
--- a/src/DynamicData/Platforms/net45/PTransform.cs
+++ b/src/DynamicData/Platforms/net45/PTransform.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Platforms/net45/ParallelEx.cs b/src/DynamicData/Platforms/net45/ParallelEx.cs
index 13cb6cb41..3d29d2b96 100644
--- a/src/DynamicData/Platforms/net45/ParallelEx.cs
+++ b/src/DynamicData/Platforms/net45/ParallelEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Platforms/net45/ParallelOperators.cs b/src/DynamicData/Platforms/net45/ParallelOperators.cs
index eda3bc6e5..b79624fca 100644
--- a/src/DynamicData/Platforms/net45/ParallelOperators.cs
+++ b/src/DynamicData/Platforms/net45/ParallelOperators.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Platforms/net45/ParallelType.cs b/src/DynamicData/Platforms/net45/ParallelType.cs
index 53f0877a5..1ef290a51 100644
--- a/src/DynamicData/Platforms/net45/ParallelType.cs
+++ b/src/DynamicData/Platforms/net45/ParallelType.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Platforms/net45/ParallelisationOptions.cs b/src/DynamicData/Platforms/net45/ParallelisationOptions.cs
index 09d5ef8ec..72011b438 100644
--- a/src/DynamicData/Platforms/net45/ParallelisationOptions.cs
+++ b/src/DynamicData/Platforms/net45/ParallelisationOptions.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Polyfills/CompilerFeatureRequiredAttribute.cs b/src/DynamicData/Polyfills/CompilerFeatureRequiredAttribute.cs
index 009e4a8cc..cdcff56c9 100644
--- a/src/DynamicData/Polyfills/CompilerFeatureRequiredAttribute.cs
+++ b/src/DynamicData/Polyfills/CompilerFeatureRequiredAttribute.cs
@@ -1,6 +1,7 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
+
#if !NET7_0_OR_GREATER
namespace System.Runtime.CompilerServices;
diff --git a/src/DynamicData/Polyfills/DynamicallyAccessedMembersAttribute.cs b/src/DynamicData/Polyfills/DynamicallyAccessedMembersAttribute.cs
index d1bed74e7..7c591011b 100644
--- a/src/DynamicData/Polyfills/DynamicallyAccessedMembersAttribute.cs
+++ b/src/DynamicData/Polyfills/DynamicallyAccessedMembersAttribute.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Polyfills/EnumEx.cs b/src/DynamicData/Polyfills/EnumEx.cs
index fba421293..1e590a8b3 100644
--- a/src/DynamicData/Polyfills/EnumEx.cs
+++ b/src/DynamicData/Polyfills/EnumEx.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
diff --git a/src/DynamicData/Polyfills/IsExternalInit.cs b/src/DynamicData/Polyfills/IsExternalInit.cs
index d4a199189..4542c2eed 100644
--- a/src/DynamicData/Polyfills/IsExternalInit.cs
+++ b/src/DynamicData/Polyfills/IsExternalInit.cs
@@ -1,6 +1,7 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
+
#if !NETCOREAPP
namespace System.Runtime.CompilerServices;
diff --git a/src/DynamicData/Polyfills/ListEnsureCapacity.cs b/src/DynamicData/Polyfills/ListEnsureCapacity.cs
index d11559339..671b66760 100644
--- a/src/DynamicData/Polyfills/ListEnsureCapacity.cs
+++ b/src/DynamicData/Polyfills/ListEnsureCapacity.cs
@@ -1,6 +1,7 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
+
#if !NETCOREAPP
namespace System.Collections.Generic;
diff --git a/src/DynamicData/Polyfills/RequiredMemberAttribute.cs b/src/DynamicData/Polyfills/RequiredMemberAttribute.cs
index 8814dcccc..b1bbc836d 100644
--- a/src/DynamicData/Polyfills/RequiredMemberAttribute.cs
+++ b/src/DynamicData/Polyfills/RequiredMemberAttribute.cs
@@ -1,6 +1,7 @@
-// Copyright (c) 2011-2023 Roland Pheasant. All rights reserved.
+// Copyright (c) 2011-2025 Roland Pheasant. All rights reserved.
// Roland Pheasant licenses this file to you under the MIT license.
// See the LICENSE file in the project root for full license information.
+
#if !NET7_0_OR_GREATER
using System.ComponentModel;
diff --git a/src/global.json b/src/global.json
deleted file mode 100644
index 5cfa01d9c..000000000
--- a/src/global.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "msbuild-sdks": {
- "MSBuild.Sdk.Extras": "3.0.44"
- }
-}
diff --git a/src/stylecop.json b/src/stylecop.json
index 857ae5b58..316f7617d 100644
--- a/src/stylecop.json
+++ b/src/stylecop.json
@@ -13,7 +13,7 @@
"documentPrivateFields": false,
"documentationCulture": "en-US",
"companyName": "Roland Pheasant",
- "copyrightText": "Copyright (c) 2011-2023 {companyName}. All rights reserved.\n{companyName} licenses this file to you under the {licenseName} license.\nSee the LICENSE file in the project root for full license information.",
+ "copyrightText": "Copyright (c) 2011-2025 {companyName}. All rights reserved.\n{companyName} licenses this file to you under the {licenseName} license.\nSee the LICENSE file in the project root for full license information.",
"variables": {
"licenseName": "MIT",
"licenseFile": "LICENSE"