From 96d74bc526b3baa5934ee2cc6fc99296b9585a7f Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 21 Mar 2018 22:24:01 +0000 Subject: [PATCH 1/3] Add StringValues.IsNull --- .../StringValues.cs | 67 ++++++++++--------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/src/Microsoft.Extensions.Primitives/StringValues.cs b/src/Microsoft.Extensions.Primitives/StringValues.cs index d8da66d895a..77af635b805 100644 --- a/src/Microsoft.Extensions.Primitives/StringValues.cs +++ b/src/Microsoft.Extensions.Primitives/StringValues.cs @@ -27,8 +27,23 @@ public StringValues(string value) public StringValues(string[] values) { - _value = null; - _values = values; + if (values == null || values.Length == 0) + { + // Set null and empty arrays to null + _value = null; // Both null is required for + _values = null; // IsNull property to work correctly + } + else if (values.Length == 1) + { + // Set single item arrays to the string value + _values = null; + _value = values[0]; + } + else + { + _value = null; + _values = values; + } } public static implicit operator StringValues(string value) @@ -53,6 +68,8 @@ public static implicit operator string[] (StringValues value) public int Count => _value != null ? 1 : (_values?.Length ?? 0); + public bool IsNull => _value == null && _values == null; + bool ICollection.IsReadOnly { get { return true; } @@ -85,19 +102,7 @@ public override string ToString() return GetStringValue() ?? string.Empty; } - private string GetStringValue() - { - if (_values == null) - { - return _value; - } - switch (_values.Length) - { - case 0: return null; - case 1: return _values[0]; - default: return string.Join(",", _values); - } - } + private string GetStringValue() => (_values == null) ? _value : string.Join(",", _values); public string[] ToArray() { @@ -225,29 +230,25 @@ public static bool IsNullOrEmpty(StringValues value) { return string.IsNullOrEmpty(value._value); } - switch (value._values.Length) - { - case 0: return true; - case 1: return string.IsNullOrEmpty(value._values[0]); - default: return false; - } + + return false; } public static StringValues Concat(StringValues values1, StringValues values2) { - var count1 = values1.Count; - var count2 = values2.Count; - if (count1 == 0) + if (values1.IsNull) { return values2; } - if (count2 == 0) + if (values2.IsNull) { return values1; } + var count1 = values1.Count; + var count2 = values2.Count; var combined = new string[count1 + count2]; values1.CopyTo(combined, 0); values2.CopyTo(combined, count1); @@ -261,12 +262,12 @@ public static StringValues Concat(in StringValues values, string value) return values; } - var count = values.Count; - if (count == 0) + if (values.IsNull) { return new StringValues(value); } + var count = values.Count; var combined = new string[count + 1]; values.CopyTo(combined, 0); combined[count] = value; @@ -280,12 +281,12 @@ public static StringValues Concat(string value, in StringValues values) return values; } - var count = values.Count; - if (count == 0) + if (values.IsNull) { return new StringValues(value); } + var count = values.Count; var combined = new string[count + 1]; combined[0] = value; values.CopyTo(combined, 1); @@ -420,12 +421,12 @@ public override bool Equals(object obj) { if (obj == null) { - return Equals(this, StringValues.Empty); + return this.IsNull; } - if (obj is string) + if (obj is string str) { - return Equals(this, (string)obj); + return this._value == str; } if (obj is string[]) @@ -514,4 +515,4 @@ public void Dispose() } } } -} +} \ No newline at end of file From f21bab9085ebf4a98a962d5957c63052794cd5c8 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 21 Mar 2018 22:26:57 +0000 Subject: [PATCH 2/3] Null StringValues convert to Empty Array --- src/Microsoft.Extensions.Primitives/StringValues.cs | 4 ++-- .../StringValuesTests.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.Extensions.Primitives/StringValues.cs b/src/Microsoft.Extensions.Primitives/StringValues.cs index 77af635b805..a555c6071b2 100644 --- a/src/Microsoft.Extensions.Primitives/StringValues.cs +++ b/src/Microsoft.Extensions.Primitives/StringValues.cs @@ -14,7 +14,7 @@ namespace Microsoft.Extensions.Primitives public readonly struct StringValues : IList, IReadOnlyList, IEquatable, IEquatable, IEquatable { private static readonly string[] EmptyArray = new string[0]; - public static readonly StringValues Empty = new StringValues(EmptyArray); + public static readonly StringValues Empty = default; private readonly string _value; private readonly string[] _values; @@ -63,7 +63,7 @@ public static implicit operator string (StringValues values) public static implicit operator string[] (StringValues value) { - return value.GetArrayValue(); + return value.ToArray(); } public int Count => _value != null ? 1 : (_values?.Length ?? 0); diff --git a/test/Microsoft.Extensions.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Extensions.Primitives.Tests/StringValuesTests.cs index 64b6e884ae1..7db2ab24755 100644 --- a/test/Microsoft.Extensions.Primitives.Tests/StringValuesTests.cs +++ b/test/Microsoft.Extensions.Primitives.Tests/StringValuesTests.cs @@ -131,7 +131,7 @@ public void IsReadOnly_True(StringValues stringValues) [MemberData(nameof(DefaultOrNullStringValues))] public void DefaultOrNull_ExpectedValues(StringValues stringValues) { - Assert.Null((string[])stringValues); + Assert.Empty((string[])stringValues); } [Theory] @@ -165,7 +165,7 @@ public void ImplicitStringConverter_Works() StringValues stringValues = nullString; Assert.Empty(stringValues); Assert.Null((string)stringValues); - Assert.Null((string[])stringValues); + Assert.Empty((string[])stringValues); string aString = "abc"; stringValues = aString; @@ -183,7 +183,7 @@ public void ImplicitStringArrayConverter_Works() StringValues stringValues = nullStringArray; Assert.Empty(stringValues); Assert.Null((string)stringValues); - Assert.Null((string[])stringValues); + Assert.Empty((string[])stringValues); string aString = "abc"; string[] aStringArray = new[] { aString }; From 5107fda4564ef561c3a50e4e6dcf7a1c7e5653f9 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 24 Mar 2018 05:08:59 +0000 Subject: [PATCH 3/3] Coalesce array conversion --- .../StringValues.cs | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/Microsoft.Extensions.Primitives/StringValues.cs b/src/Microsoft.Extensions.Primitives/StringValues.cs index a555c6071b2..49f126a6fb6 100644 --- a/src/Microsoft.Extensions.Primitives/StringValues.cs +++ b/src/Microsoft.Extensions.Primitives/StringValues.cs @@ -104,19 +104,7 @@ public override string ToString() private string GetStringValue() => (_values == null) ? _value : string.Join(",", _values); - public string[] ToArray() - { - return GetArrayValue() ?? EmptyArray; - } - - private string[] GetArrayValue() - { - if (_value != null) - { - return new[] { _value }; - } - return _values; - } + public string[] ToArray() => (_values != null) ? new[] { _value } : (_values ?? EmptyArray); int IList.IndexOf(string item) {