com.wallstop-studios.unity-helpers 2.0.0-rc56 → 2.0.0-rc58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.config/dotnet-tools.json +9 -9
- package/.editorconfig +184 -184
- package/.gitattributes +63 -63
- package/.github/workflows/npm-publish.yml +66 -66
- package/.pre-commit-config.yaml +21 -21
- package/Editor/AnimationCopier.cs +181 -181
- package/Editor/AnimationCopier.cs.meta +2 -2
- package/Editor/AnimationCreator.cs +253 -253
- package/Editor/AnimationCreator.cs.meta +11 -11
- package/Editor/AnimationEventEditor.cs +887 -887
- package/Editor/AnimatorControllerCopier.cs +162 -162
- package/Editor/AnimatorControllerCopier.cs.meta +2 -2
- package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs +34 -34
- package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs.meta +2 -2
- package/Editor/CustomEditors.meta +2 -2
- package/Editor/FitTextureSizeWizard.cs +147 -147
- package/Editor/FitTextureSizeWizard.cs.meta +2 -2
- package/Editor/PrefabCheckWizard.cs +170 -170
- package/Editor/PrefabCheckWizard.cs.meta +11 -11
- package/Editor/SpriteSettingsApplier.cs +272 -272
- package/Editor/SpriteSettingsApplier.cs.meta +2 -2
- package/Editor/StringInListeDrawer.cs +56 -56
- package/Editor/TextureResizerWizard.cs +181 -181
- package/Editor/TextureResizerWizard.cs.meta +2 -2
- package/Editor/TextureSettingsApplier.cs +178 -178
- package/Editor/TextureSettingsApplier.cs.meta +2 -2
- package/Editor/Utils/DxReadOnlyPropertyDrawer.cs +26 -26
- package/Editor/Utils/DxReadOnlyPropertyDrawer.cs.meta +11 -11
- package/Editor/Utils/EditorUtilities.cs +22 -22
- package/Editor/Utils/EditorUtilities.cs.meta +11 -11
- package/Editor/Utils.meta +8 -8
- package/Editor/WShowIfPropertyDrawer.cs +63 -63
- package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef +17 -17
- package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef.meta +7 -7
- package/LICENSE +21 -21
- package/LICENSE.md +6 -6
- package/LICENSE.meta +7 -7
- package/README.md +177 -177
- package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll.meta +33 -33
- package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml +223 -223
- package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml.meta +7 -7
- package/Runtime/Binaries/System.Text.Encodings.Web.dll.meta +33 -33
- package/Runtime/Binaries/System.Text.Encodings.Web.xml +935 -935
- package/Runtime/Binaries/System.Text.Encodings.Web.xml.meta +7 -7
- package/Runtime/Binaries/System.Text.Json.dll.meta +33 -33
- package/Runtime/Binaries/System.Text.Json.xml +4829 -4829
- package/Runtime/Binaries/System.Text.Json.xml.meta +7 -7
- package/Runtime/Binaries.meta +8 -8
- package/Runtime/Core/Attributes/AnimationEventAttribute.cs +131 -131
- package/Runtime/Core/Attributes/ChildComponentAttribute.cs +209 -209
- package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs +6 -6
- package/Runtime/Core/Attributes/KSerializableAttribute.cs +19 -19
- package/Runtime/Core/Attributes/NotNullAttribute.cs +32 -32
- package/Runtime/Core/Attributes/ParentComponent.cs +185 -185
- package/Runtime/Core/Attributes/RelationalComponentExtensions.cs +14 -14
- package/Runtime/Core/Attributes/SiblingComponentAttribute.cs +117 -117
- package/Runtime/Core/Attributes/SiblingComponentAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs +101 -101
- package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/WShowIfAttribute.cs +16 -16
- package/Runtime/Core/Attributes.meta +8 -8
- package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs +92 -92
- package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs +185 -185
- package/Runtime/Core/DataStructure/Adapters/KGuid.cs +305 -305
- package/Runtime/Core/DataStructure/Adapters/KVector2.cs +80 -80
- package/Runtime/Core/DataStructure/Circle.cs +50 -50
- package/Runtime/Core/DataStructure/CyclicBuffer.cs +153 -153
- package/Runtime/Core/DataStructure/ISpatialTree.cs +60 -60
- package/Runtime/Core/DataStructure/ISpatialTree.cs.meta +11 -11
- package/Runtime/Core/DataStructure/KDTree.cs +292 -292
- package/Runtime/Core/DataStructure/KDTree.cs.meta +11 -11
- package/Runtime/Core/DataStructure/QuadTree.cs +287 -287
- package/Runtime/Core/DataStructure/RTree.cs +346 -346
- package/Runtime/Core/DataStructure/RTree.cs.meta +11 -11
- package/Runtime/Core/DataStructure/StringWrapper.cs +91 -91
- package/Runtime/Core/DataStructure/TimedCache.cs +66 -66
- package/Runtime/Core/Extension/AnimatorExtensions.cs +25 -25
- package/Runtime/Core/Extension/AsyncOperationExtensions.cs +110 -108
- package/Runtime/Core/Extension/CircleExtensions.cs +25 -25
- package/Runtime/Core/Extension/ColorExtensions.cs +629 -629
- package/Runtime/Core/Extension/DictionaryExtensions.cs +279 -279
- package/Runtime/Core/Extension/DirectionExtensions.cs +213 -213
- package/Runtime/Core/Extension/EnumExtensions.cs +37 -37
- package/Runtime/Core/Extension/EnumExtensions.cs.meta +2 -2
- package/Runtime/Core/Extension/HashSetExtensions.cs +12 -12
- package/Runtime/Core/Extension/IEnumerableExtensions.cs +122 -122
- package/Runtime/Core/Extension/IListExtensions.cs +106 -106
- package/Runtime/Core/Extension/LoggingExtensions.cs +258 -258
- package/Runtime/Core/Extension/RandomExtensions.cs +109 -109
- package/Runtime/Core/Extension/SerializedPropertyExtensions.cs +157 -157
- package/Runtime/Core/Extension/StringExtensions.cs +151 -151
- package/Runtime/Core/Extension/UnityExtensions.cs +1608 -1608
- package/Runtime/Core/Helper/ArrayConverter.cs +39 -39
- package/Runtime/Core/Helper/ArrayConverter.cs.meta +2 -2
- package/Runtime/Core/Helper/AssignUtilities.cs +14 -14
- package/Runtime/Core/Helper/AssignUtilities.cs.meta +11 -11
- package/Runtime/Core/Helper/Enumerables.cs +17 -17
- package/Runtime/Core/Helper/FormattingHelpers.cs +32 -32
- package/Runtime/Core/Helper/Geometry.cs +43 -43
- package/Runtime/Core/Helper/Helpers.cs +722 -722
- package/Runtime/Core/Helper/Helpers.cs.meta +11 -11
- package/Runtime/Core/Helper/IterationHelpers.cs +32 -32
- package/Runtime/Core/Helper/IterationHelpers.cs.meta +11 -11
- package/Runtime/Core/Helper/LifetimeHelpers.cs +13 -13
- package/Runtime/Core/Helper/Objects.cs +769 -769
- package/Runtime/Core/Helper/Partials/LogHelpers.cs +13 -13
- package/Runtime/Core/Helper/Partials/LogHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/Partials/MathHelpers.cs +30 -30
- package/Runtime/Core/Helper/Partials/MathHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/Partials/ObjectHelpers.cs +388 -388
- package/Runtime/Core/Helper/Partials/ObjectHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/Partials/TransformHelpers.cs +189 -189
- package/Runtime/Core/Helper/Partials/TransformHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/Partials.meta +2 -2
- package/Runtime/Core/Helper/ReflectionHelpers.cs +452 -452
- package/Runtime/Core/Helper/ReflectionHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/SceneHelper.cs +209 -213
- package/Runtime/Core/Helper/SpriteHelpers.cs +41 -41
- package/Runtime/Core/Helper/SpriteHelpers.cs.meta +11 -11
- package/Runtime/Core/Helper/StringInList.cs +31 -31
- package/Runtime/Core/Helper/StringInList.cs.meta +11 -11
- package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs +82 -80
- package/Runtime/Core/Helper/WallMath.cs +166 -166
- package/Runtime/Core/Math/Line.cs +55 -55
- package/Runtime/Core/Math/Parabola.cs +47 -47
- package/Runtime/Core/Math/PointPolygonCheck.cs +36 -36
- package/Runtime/Core/Math/PointPolygonCheck.cs.meta +11 -11
- package/Runtime/Core/Math/Range.cs +92 -92
- package/Runtime/Core/Math/XXHash.cs +310 -310
- package/Runtime/Core/Math/XXHash.cs.meta +11 -11
- package/Runtime/Core/Model/Direction.cs +43 -43
- package/Runtime/Core/OneOf/FastOneOf.cs +152 -152
- package/Runtime/Core/OneOf/None.cs +4 -4
- package/Runtime/Core/Random/AbstractRandom.cs +585 -585
- package/Runtime/Core/Random/DotNetRandom.cs +54 -54
- package/Runtime/Core/Random/DotNetRandom.cs.meta +2 -2
- package/Runtime/Core/Random/IRandom.cs +161 -161
- package/Runtime/Core/Random/LinearCongruentialGenerator.cs +49 -49
- package/Runtime/Core/Random/NativePcgRandom.cs +97 -97
- package/Runtime/Core/Random/PRNG.cs +7 -7
- package/Runtime/Core/Random/PRNG.cs.meta +2 -2
- package/Runtime/Core/Random/PcgRandom.cs +149 -149
- package/Runtime/Core/Random/PerlinNoise.cs +369 -369
- package/Runtime/Core/Random/PerlinNoise.cs.meta +2 -2
- package/Runtime/Core/Random/RandomState.cs +131 -131
- package/Runtime/Core/Random/RandomUtilities.cs +26 -26
- package/Runtime/Core/Random/RandomUtilities.cs.meta +11 -11
- package/Runtime/Core/Random/RomuDuo.cs +116 -116
- package/Runtime/Core/Random/RomuDuo.cs.meta +2 -2
- package/Runtime/Core/Random/SplitMix64.cs +94 -94
- package/Runtime/Core/Random/SplitMix64.cs.meta +2 -2
- package/Runtime/Core/Random/SquirrelRandom.cs +84 -84
- package/Runtime/Core/Random/SystemRandom.cs +162 -162
- package/Runtime/Core/Random/ThreadLocalRandom.cs +12 -12
- package/Runtime/Core/Random/UnityRandom.cs +57 -57
- package/Runtime/Core/Random/UnityRandom.cs.meta +11 -11
- package/Runtime/Core/Random/WyRandom.cs +121 -121
- package/Runtime/Core/Random/WyRandom.cs.meta +2 -2
- package/Runtime/Core/Random/XorShiftRandom.cs +52 -52
- package/Runtime/Core/Random/XorShiftRandom.cs.meta +11 -11
- package/Runtime/Core/Random/XorShiroRandom.cs +119 -119
- package/Runtime/Core/Random/XorShiroRandom.cs.meta +2 -2
- package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs +88 -88
- package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs +37 -37
- package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs +218 -218
- package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs +28 -28
- package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs +74 -74
- package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs +81 -81
- package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs +88 -88
- package/Runtime/Core/Serialization/Serializer.cs +195 -195
- package/Runtime/Core/Threading/SingleThreadedThreadPool.cs +113 -113
- package/Runtime/Protobuf-Net/System.Buffers.dll.meta +33 -33
- package/Runtime/Protobuf-Net/System.Collections.Immutable.dll.meta +33 -33
- package/Runtime/Protobuf-Net/System.Collections.Immutable.xml +5379 -5379
- package/Runtime/Protobuf-Net/System.Collections.Immutable.xml.meta +7 -7
- package/Runtime/Protobuf-Net/System.Numerics.Vectors.dll.meta +33 -33
- package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.dll.meta +33 -33
- package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.xml +290 -290
- package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.xml.meta +7 -7
- package/Runtime/Protobuf-Net/protobuf-net.Core.dll.meta +33 -33
- package/Runtime/Protobuf-Net/protobuf-net.dll.meta +33 -33
- package/Runtime/UI/LayeredImage.cs +364 -364
- package/Runtime/UI/LayeredImage.cs.meta +2 -2
- package/Runtime/UI.meta +2 -2
- package/Runtime/Utils/AnimationEventEqualityComparer.cs +161 -161
- package/Runtime/Utils/AnimatorEnumStateMachine.cs +88 -88
- package/Runtime/Utils/Buffers.cs +33 -33
- package/Runtime/Utils/CenterPointOffset.cs +30 -30
- package/Runtime/Utils/CenterPointOffset.cs.meta +2 -2
- package/Runtime/Utils/CircleLineRenderer.cs +134 -134
- package/Runtime/Utils/CoroutineHandler.cs +4 -4
- package/Runtime/Utils/CoroutineHandler.cs.meta +2 -2
- package/Runtime/Utils/DeferredDisposalResult.cs +23 -23
- package/Runtime/Utils/MatchColliderToSprite.cs +94 -94
- package/Runtime/Utils/MatchColliderToSprite.cs.meta +2 -2
- package/Runtime/Utils/Oscillator.cs +27 -27
- package/Runtime/Utils/RuntimeSingleton.cs +69 -69
- package/Runtime/Utils/RuntimeSingleton.cs.meta +11 -11
- package/Runtime/Utils/SetTextureImportData.cs +69 -69
- package/Runtime/Utils/SpriteRendererMetadata.cs +374 -374
- package/Runtime/Utils/SpriteRendererMetadata.cs.meta +2 -2
- package/Runtime/Utils/SpriteRendererSyncer.cs +100 -100
- package/Runtime/Utils/SpriteRendererSyncer.cs.meta +2 -2
- package/Runtime/Utils/TextureScale.cs +179 -179
- package/Runtime/Utils/TextureScale.cs.meta +2 -2
- package/Runtime/WallstopStudios.UnityHelpers.asmdef +13 -13
- package/Tests/Runtime/Attributes/ChildComponentTests.cs +81 -81
- package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs +28 -28
- package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs +28 -28
- package/Tests/Runtime/Attributes/ParentComponentTests.cs +68 -68
- package/Tests/Runtime/Components/RelationalComponentTesterComplex.cs +34 -34
- package/Tests/Runtime/Components/RelationalComponentTesterComplex.cs.meta +2 -2
- package/Tests/Runtime/Components/RelationalComponentsTesterSimple.cs +40 -40
- package/Tests/Runtime/Components.meta +2 -2
- package/Tests/Runtime/DataStructures/BalancedKDTreeTests.cs +14 -14
- package/Tests/Runtime/DataStructures/BalancedKDTreeTests.cs.meta +11 -11
- package/Tests/Runtime/DataStructures/CyclicBufferTests.cs +324 -324
- package/Tests/Runtime/DataStructures/QuadTreeTests.cs +14 -14
- package/Tests/Runtime/DataStructures/QuadTreeTests.cs.meta +11 -11
- package/Tests/Runtime/DataStructures/SpatialTreeTests.cs +130 -130
- package/Tests/Runtime/DataStructures/SpatialTreeTests.cs.meta +11 -11
- package/Tests/Runtime/DataStructures/UnbalancedKDTreeTests.cs +14 -14
- package/Tests/Runtime/DataStructures/UnbalancedKDTreeTests.cs.meta +11 -11
- package/Tests/Runtime/DataStructures.meta +8 -8
- package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs +439 -439
- package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/EnumExtensionTests.cs +128 -128
- package/Tests/Runtime/Extensions/EnumExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/IListExtensionTests.cs +104 -104
- package/Tests/Runtime/Extensions/RandomExtensionTests.cs +27 -27
- package/Tests/Runtime/Extensions/RandomExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/StringExtensionTests.cs +31 -31
- package/Tests/Runtime/Extensions/StringExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions.meta +2 -2
- package/Tests/Runtime/Helper/ArrayConverterTests.cs +19 -19
- package/Tests/Runtime/Helper/ArrayConverterTests.cs.meta +2 -2
- package/Tests/Runtime/Helper/FormattingHelperTests.cs +129 -129
- package/Tests/Runtime/Helper/FormattingHelperTests.cs.meta +2 -2
- package/Tests/Runtime/Helper/ObjectHelperTests.cs +402 -402
- package/Tests/Runtime/Helper/ObjectHelperTests.cs.meta +2 -2
- package/Tests/Runtime/Helper/ReflectionHelperTests.cs +536 -536
- package/Tests/Runtime/Helper/SceneHelperTests.cs +94 -94
- package/Tests/Runtime/Helper/WallMathTests.cs +233 -233
- package/Tests/Runtime/Helper/WallMathTests.cs.meta +2 -2
- package/Tests/Runtime/Helper.meta +2 -2
- package/Tests/Runtime/Performance/KDTreePerformanceTests.cs +14 -14
- package/Tests/Runtime/Performance/KDTreePerformanceTests.cs.meta +11 -11
- package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs +14 -14
- package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs.meta +11 -11
- package/Tests/Runtime/Performance/RandomPerformanceTests.cs +157 -157
- package/Tests/Runtime/Performance/RandomPerformanceTests.cs.meta +11 -11
- package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs +61 -61
- package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs.meta +2 -2
- package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs +154 -154
- package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs.meta +11 -11
- package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs +14 -14
- package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs.meta +11 -11
- package/Tests/Runtime/Performance.meta +8 -8
- package/Tests/Runtime/Random/DotNetRandomTests.cs +9 -9
- package/Tests/Runtime/Random/DotNetRandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs +12 -12
- package/Tests/Runtime/Random/PcgRandomTests.cs +9 -9
- package/Tests/Runtime/Random/PcgRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/RandomTestBase.cs +787 -787
- package/Tests/Runtime/Random/RandomTestBase.cs.meta +11 -11
- package/Tests/Runtime/Random/RomuDuoRandomTests.cs +9 -9
- package/Tests/Runtime/Random/RomuDuoRandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random/SplitMix64RandomTests.cs +9 -9
- package/Tests/Runtime/Random/SplitMix64RandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random/SquirrelRandomTests.cs +14 -14
- package/Tests/Runtime/Random/SquirrelRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/SystemRandomTests.cs +10 -10
- package/Tests/Runtime/Random/SystemRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/UnityRandomTests.cs +9 -9
- package/Tests/Runtime/Random/UnityRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/WyRandomTests.cs +9 -9
- package/Tests/Runtime/Random/WyRandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random/XorShiftRandomTests.cs +9 -9
- package/Tests/Runtime/Random/XorShiftRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/XorShiroRandomTests.cs +9 -9
- package/Tests/Runtime/Random/XorShiroRandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random.meta +8 -8
- package/Tests/Runtime/Serialization/JsonSerializationTest.cs +156 -156
- package/Tests/Runtime/Serialization/JsonSerializationTest.cs.meta +2 -2
- package/Tests/Runtime/Serialization.meta +2 -2
- package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs +399 -399
- package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs.meta +2 -2
- package/Tests/Runtime/Utils.meta +2 -2
- package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef +22 -22
- package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef.meta +7 -7
- package/Tests/Runtime.meta +8 -8
- package/package.json +38 -38
|
@@ -1,279 +1,279 @@
|
|
|
1
|
-
namespace UnityHelpers.Core.Extension
|
|
2
|
-
{
|
|
3
|
-
using System;
|
|
4
|
-
using System.Collections.Concurrent;
|
|
5
|
-
using System.Collections.Generic;
|
|
6
|
-
using System.Linq;
|
|
7
|
-
|
|
8
|
-
public static class DictionaryExtensions
|
|
9
|
-
{
|
|
10
|
-
public static V GetOrAdd<K, V>(
|
|
11
|
-
this IDictionary<K, V> dictionary,
|
|
12
|
-
K key,
|
|
13
|
-
Func<V> valueProducer
|
|
14
|
-
)
|
|
15
|
-
{
|
|
16
|
-
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
17
|
-
{
|
|
18
|
-
return concurrentDictionary.GetOrAdd(
|
|
19
|
-
key,
|
|
20
|
-
static (_, existing) => existing(),
|
|
21
|
-
valueProducer
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (dictionary.TryGetValue(key, out V result))
|
|
26
|
-
{
|
|
27
|
-
return result;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return dictionary[key] = valueProducer();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public static V GetOrAdd<K, V>(
|
|
34
|
-
this IDictionary<K, V> dictionary,
|
|
35
|
-
K key,
|
|
36
|
-
Func<K, V> valueProducer
|
|
37
|
-
)
|
|
38
|
-
{
|
|
39
|
-
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
40
|
-
{
|
|
41
|
-
return concurrentDictionary.GetOrAdd(key, valueProducer);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (dictionary.TryGetValue(key, out V result))
|
|
45
|
-
{
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return dictionary[key] = valueProducer(key);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public static V GetOrElse<K, V>(
|
|
53
|
-
this IReadOnlyDictionary<K, V> dictionary,
|
|
54
|
-
K key,
|
|
55
|
-
Func<V> valueProducer
|
|
56
|
-
)
|
|
57
|
-
{
|
|
58
|
-
if (dictionary.TryGetValue(key, out V value))
|
|
59
|
-
{
|
|
60
|
-
return value;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return valueProducer.Invoke();
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
public static V GetOrElse<K, V>(
|
|
67
|
-
this IReadOnlyDictionary<K, V> dictionary,
|
|
68
|
-
K key,
|
|
69
|
-
Func<K, V> valueProducer
|
|
70
|
-
)
|
|
71
|
-
{
|
|
72
|
-
if (dictionary.TryGetValue(key, out V value))
|
|
73
|
-
{
|
|
74
|
-
return value;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return valueProducer.Invoke(key);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
public static V GetOrAdd<K, V>(this IDictionary<K, V> dictionary, K key)
|
|
81
|
-
where V : new()
|
|
82
|
-
{
|
|
83
|
-
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
84
|
-
{
|
|
85
|
-
return concurrentDictionary.AddOrUpdate(
|
|
86
|
-
key,
|
|
87
|
-
_ => new V(),
|
|
88
|
-
(_, existing) => existing
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
if (dictionary.TryGetValue(key, out V result))
|
|
93
|
-
{
|
|
94
|
-
return result;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return dictionary[key] = new V();
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
public static V GetOrElse<K, V>(this IReadOnlyDictionary<K, V> dictionary, K key, V value)
|
|
101
|
-
{
|
|
102
|
-
return GetOrElse(dictionary, key, () => value);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
public static V AddOrUpdate<K, V>(
|
|
106
|
-
this IDictionary<K, V> dictionary,
|
|
107
|
-
K key,
|
|
108
|
-
Func<K, V> creator,
|
|
109
|
-
Func<K, V, V> updater
|
|
110
|
-
)
|
|
111
|
-
{
|
|
112
|
-
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
113
|
-
{
|
|
114
|
-
return concurrentDictionary.AddOrUpdate(key, creator, updater);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
V latest = dictionary.TryGetValue(key, out V value)
|
|
118
|
-
? updater(key, value)
|
|
119
|
-
: creator(key);
|
|
120
|
-
dictionary[key] = latest;
|
|
121
|
-
return latest;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
public static V TryAdd<K, V>(this IDictionary<K, V> dictionary, K key, Func<K, V> creator)
|
|
125
|
-
{
|
|
126
|
-
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
127
|
-
{
|
|
128
|
-
return concurrentDictionary.AddOrUpdate(
|
|
129
|
-
key,
|
|
130
|
-
creator,
|
|
131
|
-
(_, existingValue) => existingValue
|
|
132
|
-
);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (dictionary.TryGetValue(key, out V existing))
|
|
136
|
-
{
|
|
137
|
-
return existing;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
V value = creator(key);
|
|
141
|
-
dictionary[key] = value;
|
|
142
|
-
return value;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
public static Dictionary<K, V> Merge<K, V>(
|
|
146
|
-
this IReadOnlyDictionary<K, V> lhs,
|
|
147
|
-
IReadOnlyDictionary<K, V> rhs
|
|
148
|
-
)
|
|
149
|
-
{
|
|
150
|
-
Dictionary<K, V> result = new();
|
|
151
|
-
if (0 < lhs.Count)
|
|
152
|
-
{
|
|
153
|
-
foreach (KeyValuePair<K, V> kvp in lhs)
|
|
154
|
-
{
|
|
155
|
-
result[kvp.Key] = kvp.Value;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (0 < rhs.Count)
|
|
160
|
-
{
|
|
161
|
-
foreach (KeyValuePair<K, V> kvp in rhs)
|
|
162
|
-
{
|
|
163
|
-
result[kvp.Key] = kvp.Value;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return result;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/// <summary>
|
|
171
|
-
/// </summary>
|
|
172
|
-
/// <typeparam name="K">Key type.</typeparam>
|
|
173
|
-
/// <typeparam name="V">Value type.</typeparam>
|
|
174
|
-
/// <param name="lhs">Basis dictionary.</param>
|
|
175
|
-
/// <param name="rhs">Changed dictionary.</param>
|
|
176
|
-
/// <returns>All elements of rhs that either don't exist in or are different from lhs</returns>
|
|
177
|
-
public static Dictionary<K, V> Difference<K, V>(
|
|
178
|
-
this IReadOnlyDictionary<K, V> lhs,
|
|
179
|
-
IReadOnlyDictionary<K, V> rhs
|
|
180
|
-
)
|
|
181
|
-
{
|
|
182
|
-
Dictionary<K, V> result = new(rhs.Count);
|
|
183
|
-
foreach (KeyValuePair<K, V> kvp in rhs)
|
|
184
|
-
{
|
|
185
|
-
K key = kvp.Key;
|
|
186
|
-
if (lhs.TryGetValue(key, out V existing) && Equals(existing, kvp.Value))
|
|
187
|
-
{
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
result[key] = kvp.Value;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return result;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
public static Dictionary<V, K> Reverse<K, V>(this IReadOnlyDictionary<K, V> dictionary)
|
|
198
|
-
{
|
|
199
|
-
Dictionary<V, K> output = new(dictionary.Count);
|
|
200
|
-
foreach (KeyValuePair<K, V> entry in dictionary)
|
|
201
|
-
{
|
|
202
|
-
output[entry.Value] = entry.Key;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
return output;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
public static Dictionary<K, V> ToDictionary<K, V>(this IReadOnlyDictionary<K, V> dictionary)
|
|
209
|
-
{
|
|
210
|
-
return new Dictionary<K, V>(dictionary);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
214
|
-
this IReadOnlyDictionary<K, V> dictionary,
|
|
215
|
-
IEqualityComparer<K> comparer
|
|
216
|
-
)
|
|
217
|
-
{
|
|
218
|
-
return new Dictionary<K, V>(dictionary, comparer);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
222
|
-
this IEnumerable<KeyValuePair<K, V>> prettyMuchADictionary
|
|
223
|
-
)
|
|
224
|
-
{
|
|
225
|
-
return prettyMuchADictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
229
|
-
this IEnumerable<KeyValuePair<K, V>> prettyMuchADictionary,
|
|
230
|
-
IEqualityComparer<K> comparer
|
|
231
|
-
)
|
|
232
|
-
{
|
|
233
|
-
return prettyMuchADictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value, comparer);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
237
|
-
this IEnumerable<(K, V)> prettyMuchADictionary
|
|
238
|
-
)
|
|
239
|
-
{
|
|
240
|
-
return prettyMuchADictionary.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
244
|
-
this IEnumerable<(K, V)> prettyMuchADictionary,
|
|
245
|
-
IEqualityComparer<K> comparer
|
|
246
|
-
)
|
|
247
|
-
{
|
|
248
|
-
return prettyMuchADictionary.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2, comparer);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
public static bool ContentEquals<K, V>(
|
|
252
|
-
this IReadOnlyDictionary<K, V> dictionary,
|
|
253
|
-
IReadOnlyDictionary<K, V> other
|
|
254
|
-
)
|
|
255
|
-
where V : IEquatable<V>
|
|
256
|
-
{
|
|
257
|
-
if (ReferenceEquals(dictionary, other))
|
|
258
|
-
{
|
|
259
|
-
return true;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
if (ReferenceEquals(dictionary, null) || ReferenceEquals(other, null))
|
|
263
|
-
{
|
|
264
|
-
return false;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return dictionary.Count == other.Count
|
|
268
|
-
&& dictionary.All(kvp =>
|
|
269
|
-
other.TryGetValue(kvp.Key, out V value) && kvp.Value.Equals(value)
|
|
270
|
-
);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
public static void Deconstruct<K, V>(this KeyValuePair<K, V> kvp, out K key, out V value)
|
|
274
|
-
{
|
|
275
|
-
key = kvp.Key;
|
|
276
|
-
value = kvp.Value;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
1
|
+
namespace UnityHelpers.Core.Extension
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
using System.Collections.Concurrent;
|
|
5
|
+
using System.Collections.Generic;
|
|
6
|
+
using System.Linq;
|
|
7
|
+
|
|
8
|
+
public static class DictionaryExtensions
|
|
9
|
+
{
|
|
10
|
+
public static V GetOrAdd<K, V>(
|
|
11
|
+
this IDictionary<K, V> dictionary,
|
|
12
|
+
K key,
|
|
13
|
+
Func<V> valueProducer
|
|
14
|
+
)
|
|
15
|
+
{
|
|
16
|
+
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
17
|
+
{
|
|
18
|
+
return concurrentDictionary.GetOrAdd(
|
|
19
|
+
key,
|
|
20
|
+
static (_, existing) => existing(),
|
|
21
|
+
valueProducer
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (dictionary.TryGetValue(key, out V result))
|
|
26
|
+
{
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return dictionary[key] = valueProducer();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static V GetOrAdd<K, V>(
|
|
34
|
+
this IDictionary<K, V> dictionary,
|
|
35
|
+
K key,
|
|
36
|
+
Func<K, V> valueProducer
|
|
37
|
+
)
|
|
38
|
+
{
|
|
39
|
+
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
40
|
+
{
|
|
41
|
+
return concurrentDictionary.GetOrAdd(key, valueProducer);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (dictionary.TryGetValue(key, out V result))
|
|
45
|
+
{
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return dictionary[key] = valueProducer(key);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public static V GetOrElse<K, V>(
|
|
53
|
+
this IReadOnlyDictionary<K, V> dictionary,
|
|
54
|
+
K key,
|
|
55
|
+
Func<V> valueProducer
|
|
56
|
+
)
|
|
57
|
+
{
|
|
58
|
+
if (dictionary.TryGetValue(key, out V value))
|
|
59
|
+
{
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return valueProducer.Invoke();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public static V GetOrElse<K, V>(
|
|
67
|
+
this IReadOnlyDictionary<K, V> dictionary,
|
|
68
|
+
K key,
|
|
69
|
+
Func<K, V> valueProducer
|
|
70
|
+
)
|
|
71
|
+
{
|
|
72
|
+
if (dictionary.TryGetValue(key, out V value))
|
|
73
|
+
{
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return valueProducer.Invoke(key);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public static V GetOrAdd<K, V>(this IDictionary<K, V> dictionary, K key)
|
|
81
|
+
where V : new()
|
|
82
|
+
{
|
|
83
|
+
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
84
|
+
{
|
|
85
|
+
return concurrentDictionary.AddOrUpdate(
|
|
86
|
+
key,
|
|
87
|
+
_ => new V(),
|
|
88
|
+
(_, existing) => existing
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (dictionary.TryGetValue(key, out V result))
|
|
93
|
+
{
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return dictionary[key] = new V();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public static V GetOrElse<K, V>(this IReadOnlyDictionary<K, V> dictionary, K key, V value)
|
|
101
|
+
{
|
|
102
|
+
return GetOrElse(dictionary, key, () => value);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public static V AddOrUpdate<K, V>(
|
|
106
|
+
this IDictionary<K, V> dictionary,
|
|
107
|
+
K key,
|
|
108
|
+
Func<K, V> creator,
|
|
109
|
+
Func<K, V, V> updater
|
|
110
|
+
)
|
|
111
|
+
{
|
|
112
|
+
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
113
|
+
{
|
|
114
|
+
return concurrentDictionary.AddOrUpdate(key, creator, updater);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
V latest = dictionary.TryGetValue(key, out V value)
|
|
118
|
+
? updater(key, value)
|
|
119
|
+
: creator(key);
|
|
120
|
+
dictionary[key] = latest;
|
|
121
|
+
return latest;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public static V TryAdd<K, V>(this IDictionary<K, V> dictionary, K key, Func<K, V> creator)
|
|
125
|
+
{
|
|
126
|
+
if (dictionary is ConcurrentDictionary<K, V> concurrentDictionary)
|
|
127
|
+
{
|
|
128
|
+
return concurrentDictionary.AddOrUpdate(
|
|
129
|
+
key,
|
|
130
|
+
creator,
|
|
131
|
+
(_, existingValue) => existingValue
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (dictionary.TryGetValue(key, out V existing))
|
|
136
|
+
{
|
|
137
|
+
return existing;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
V value = creator(key);
|
|
141
|
+
dictionary[key] = value;
|
|
142
|
+
return value;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public static Dictionary<K, V> Merge<K, V>(
|
|
146
|
+
this IReadOnlyDictionary<K, V> lhs,
|
|
147
|
+
IReadOnlyDictionary<K, V> rhs
|
|
148
|
+
)
|
|
149
|
+
{
|
|
150
|
+
Dictionary<K, V> result = new();
|
|
151
|
+
if (0 < lhs.Count)
|
|
152
|
+
{
|
|
153
|
+
foreach (KeyValuePair<K, V> kvp in lhs)
|
|
154
|
+
{
|
|
155
|
+
result[kvp.Key] = kvp.Value;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (0 < rhs.Count)
|
|
160
|
+
{
|
|
161
|
+
foreach (KeyValuePair<K, V> kvp in rhs)
|
|
162
|
+
{
|
|
163
|
+
result[kvp.Key] = kvp.Value;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/// <summary>
|
|
171
|
+
/// </summary>
|
|
172
|
+
/// <typeparam name="K">Key type.</typeparam>
|
|
173
|
+
/// <typeparam name="V">Value type.</typeparam>
|
|
174
|
+
/// <param name="lhs">Basis dictionary.</param>
|
|
175
|
+
/// <param name="rhs">Changed dictionary.</param>
|
|
176
|
+
/// <returns>All elements of rhs that either don't exist in or are different from lhs</returns>
|
|
177
|
+
public static Dictionary<K, V> Difference<K, V>(
|
|
178
|
+
this IReadOnlyDictionary<K, V> lhs,
|
|
179
|
+
IReadOnlyDictionary<K, V> rhs
|
|
180
|
+
)
|
|
181
|
+
{
|
|
182
|
+
Dictionary<K, V> result = new(rhs.Count);
|
|
183
|
+
foreach (KeyValuePair<K, V> kvp in rhs)
|
|
184
|
+
{
|
|
185
|
+
K key = kvp.Key;
|
|
186
|
+
if (lhs.TryGetValue(key, out V existing) && Equals(existing, kvp.Value))
|
|
187
|
+
{
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
result[key] = kvp.Value;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public static Dictionary<V, K> Reverse<K, V>(this IReadOnlyDictionary<K, V> dictionary)
|
|
198
|
+
{
|
|
199
|
+
Dictionary<V, K> output = new(dictionary.Count);
|
|
200
|
+
foreach (KeyValuePair<K, V> entry in dictionary)
|
|
201
|
+
{
|
|
202
|
+
output[entry.Value] = entry.Key;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return output;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
public static Dictionary<K, V> ToDictionary<K, V>(this IReadOnlyDictionary<K, V> dictionary)
|
|
209
|
+
{
|
|
210
|
+
return new Dictionary<K, V>(dictionary);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
214
|
+
this IReadOnlyDictionary<K, V> dictionary,
|
|
215
|
+
IEqualityComparer<K> comparer
|
|
216
|
+
)
|
|
217
|
+
{
|
|
218
|
+
return new Dictionary<K, V>(dictionary, comparer);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
222
|
+
this IEnumerable<KeyValuePair<K, V>> prettyMuchADictionary
|
|
223
|
+
)
|
|
224
|
+
{
|
|
225
|
+
return prettyMuchADictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
229
|
+
this IEnumerable<KeyValuePair<K, V>> prettyMuchADictionary,
|
|
230
|
+
IEqualityComparer<K> comparer
|
|
231
|
+
)
|
|
232
|
+
{
|
|
233
|
+
return prettyMuchADictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value, comparer);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
237
|
+
this IEnumerable<(K, V)> prettyMuchADictionary
|
|
238
|
+
)
|
|
239
|
+
{
|
|
240
|
+
return prettyMuchADictionary.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
public static Dictionary<K, V> ToDictionary<K, V>(
|
|
244
|
+
this IEnumerable<(K, V)> prettyMuchADictionary,
|
|
245
|
+
IEqualityComparer<K> comparer
|
|
246
|
+
)
|
|
247
|
+
{
|
|
248
|
+
return prettyMuchADictionary.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2, comparer);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
public static bool ContentEquals<K, V>(
|
|
252
|
+
this IReadOnlyDictionary<K, V> dictionary,
|
|
253
|
+
IReadOnlyDictionary<K, V> other
|
|
254
|
+
)
|
|
255
|
+
where V : IEquatable<V>
|
|
256
|
+
{
|
|
257
|
+
if (ReferenceEquals(dictionary, other))
|
|
258
|
+
{
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (ReferenceEquals(dictionary, null) || ReferenceEquals(other, null))
|
|
263
|
+
{
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return dictionary.Count == other.Count
|
|
268
|
+
&& dictionary.All(kvp =>
|
|
269
|
+
other.TryGetValue(kvp.Key, out V value) && kvp.Value.Equals(value)
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
public static void Deconstruct<K, V>(this KeyValuePair<K, V> kvp, out K key, out V value)
|
|
274
|
+
{
|
|
275
|
+
key = kvp.Key;
|
|
276
|
+
value = kvp.Value;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|