From 37491a8add50bb0238c7aef6fdd030bcf29aa397 Mon Sep 17 00:00:00 2001 From: h3xds1nz Date: Tue, 8 Apr 2025 16:04:04 +0200 Subject: [PATCH] Use HashSet and avoid double lookup on addition --- .../System/Xaml/XamlMarkupExtensionWriter.cs | 8 ++--- .../System.Xaml/System/Xaml/XamlXmlWriter.cs | 31 +++---------------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlMarkupExtensionWriter.cs b/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlMarkupExtensionWriter.cs index 058e0d2d6f2..b79a54b1e2c 100644 --- a/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlMarkupExtensionWriter.cs +++ b/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlMarkupExtensionWriter.cs @@ -129,14 +129,12 @@ private void CheckMemberForUniqueness(Node objectNode, XamlMember property) { if (objectNode.Members is null) { - objectNode.Members = new XamlPropertySet(); + objectNode.Members = new HashSet() { property }; } - else if (objectNode.Members.Contains(property)) + else if (!objectNode.Members.Add(property)) { throw new InvalidOperationException(SR.Format(SR.XamlMarkupExtensionWriterDuplicateMember, property.Name)); } - - objectNode.Members.Add(property); } } @@ -188,7 +186,7 @@ public XamlMember XamlProperty set; } - public XamlPropertySet Members + public HashSet Members { get; set; diff --git a/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlXmlWriter.cs b/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlXmlWriter.cs index 024970591e1..88311090ce0 100644 --- a/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlXmlWriter.cs +++ b/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlXmlWriter.cs @@ -495,27 +495,23 @@ private void CheckMemberForUniqueness(XamlMember property) { // Find the top most object frame. Frame objectFrame = namespaceScopes.Peek(); - if (objectFrame.AllocatingNodeType != XamlNodeType.StartObject && - objectFrame.AllocatingNodeType != XamlNodeType.GetObject) + if (objectFrame.AllocatingNodeType is not XamlNodeType.StartObject and not XamlNodeType.GetObject) { Frame temp = namespaceScopes.Pop(); objectFrame = namespaceScopes.Peek(); namespaceScopes.Push(temp); } - Debug.Assert(objectFrame.AllocatingNodeType == XamlNodeType.StartObject || - objectFrame.AllocatingNodeType == XamlNodeType.GetObject); + Debug.Assert(objectFrame.AllocatingNodeType is XamlNodeType.StartObject or XamlNodeType.GetObject); if (objectFrame.Members is null) { - objectFrame.Members = new XamlPropertySet(); + objectFrame.Members = new HashSet() { property }; } - else if (objectFrame.Members.Contains(property)) + else if (!objectFrame.Members.Add(property)) { throw new XamlXmlWriterException(SR.Format(SR.XamlXmlWriterDuplicateMember, property.Name)); } - - objectFrame.Members.Add(property); } } @@ -690,7 +686,7 @@ public XamlMember Member set; } - public XamlPropertySet Members + public HashSet Members { get; set; @@ -2181,21 +2177,4 @@ public void Reset() } } } - - // need to implement our own Set class to alleviate ties to System.Core.dll - // HashSet lives in System.Core.dll - internal class XamlPropertySet - { - private Dictionary dictionary = new Dictionary(); - - public bool Contains(XamlMember member) - { - return dictionary.ContainsKey(member); - } - - public void Add(XamlMember member) - { - dictionary.Add(member, true); - } - } }