From 49fe1968d930f306c28f6e08291a0d8d96b6ed88 Mon Sep 17 00:00:00 2001 From: Peter Butzhammer Date: Tue, 6 Feb 2024 13:19:32 +0100 Subject: [PATCH] Optimize dictionary access --- Sharp7.Rx/S7VariableNameParser.cs | 69 +++++++++++++------------------ 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/Sharp7.Rx/S7VariableNameParser.cs b/Sharp7.Rx/S7VariableNameParser.cs index 4820717..b65f4c7 100644 --- a/Sharp7.Rx/S7VariableNameParser.cs +++ b/Sharp7.Rx/S7VariableNameParser.cs @@ -12,7 +12,7 @@ namespace Sharp7.Rx { private static readonly Regex regex = new Regex(@"^(?db{1})(?\d{1,4})\.?(?dbx|x|s|string|b|dbb|d|int|dbw|w|dint|dul|dulint|dulong|){1}(?\d+)(\.(?\d+))?$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant); - private readonly Dictionary types = new Dictionary + private static readonly IReadOnlyDictionary types = new Dictionary(StringComparer.InvariantCultureIgnoreCase) { {"x", DbType.Bit}, {"dbx", DbType.Bit}, @@ -30,16 +30,17 @@ namespace Sharp7.Rx {"dulong", DbType.ULong } }; - public S7VariableAddress Parse(string input) { var match = regex.Match(input); if (match.Success) { var operand = (Operand)Enum.Parse(typeof(Operand), match.Groups["operand"].Value, true); - var dbNr = ushort.Parse(match.Groups["dbNr"].Value, NumberStyles.Integer); - var start = ushort.Parse(match.Groups["start"].Value, NumberStyles.Integer); - var type = ParseType(match.Groups["type"].Value); + var dbNr = ushort.Parse(match.Groups["dbNr"].Value, NumberStyles.Integer, CultureInfo.InvariantCulture); + var start = ushort.Parse(match.Groups["start"].Value, NumberStyles.Integer, CultureInfo.InvariantCulture); + if (!types.TryGetValue(match.Groups["type"].Value, out var type)) + return null; + var s7VariableAddress = new S7VariableAddress { @@ -49,34 +50,30 @@ namespace Sharp7.Rx Type = type, }; - if (type == DbType.Bit) + switch (type) { - s7VariableAddress.Length = 1; - s7VariableAddress.Bit = byte.Parse(match.Groups["bitOrLength"].Value); - } - else if (type == DbType.Byte) - { - s7VariableAddress.Length = match.Groups["bitOrLength"].Success ? ushort.Parse(match.Groups["bitOrLength"].Value) : (ushort)1; - } - else if (type == DbType.String) - { - s7VariableAddress.Length = match.Groups["bitOrLength"].Success ? ushort.Parse(match.Groups["bitOrLength"].Value) : (ushort)0; - } - else if (type == DbType.Integer) - { - s7VariableAddress.Length = 2; - } - else if (type == DbType.DInteger) - { - s7VariableAddress.Length = 4; - } - else if (type == DbType.ULong) - { - s7VariableAddress.Length = 8; - } - else if (type == DbType.Double) - { - s7VariableAddress.Length = 4; + case DbType.Bit: + s7VariableAddress.Length = 1; + s7VariableAddress.Bit = byte.Parse(match.Groups["bitOrLength"].Value); + break; + case DbType.Byte: + s7VariableAddress.Length = match.Groups["bitOrLength"].Success ? ushort.Parse(match.Groups["bitOrLength"].Value) : (ushort)1; + break; + case DbType.String: + s7VariableAddress.Length = match.Groups["bitOrLength"].Success ? ushort.Parse(match.Groups["bitOrLength"].Value) : (ushort)0; + break; + case DbType.Integer: + s7VariableAddress.Length = 2; + break; + case DbType.DInteger: + s7VariableAddress.Length = 4; + break; + case DbType.ULong: + s7VariableAddress.Length = 8; + break; + case DbType.Double: + s7VariableAddress.Length = 4; + break; } return s7VariableAddress; @@ -84,13 +81,5 @@ namespace Sharp7.Rx return null; } - - private DbType ParseType(string value) - { - return types - .Where(pair => pair.Key.Equals(value, StringComparison.InvariantCultureIgnoreCase)) - .Select(pair => pair.Value) - .FirstOrDefault(); - } } } \ No newline at end of file